精华内容
下载资源
问答
  • C语言标准中规定:条件表达式(三目运算符)的结合性右结合,即...一般理解,根据上面的表达式以及结合性,n的求值语句等价于int n = ++i == 0 ? 99 : (i == -1 ? 11 : 22);这时问题就出现了,有些人会对后面括号...

    在C语言标准中规定:条件表达式(三目运算符)的结合性是右结合,即自右向左结合

    比如下面这条语句

    int i = -2;

    int n = ++i == 0 ? 99 : i == -1 ? 11 : 22;

    问题是:n的值是多少?

    一般理解,根据上面的表达式以及结合性,n的求值语句等价于

    int n = ++i == 0 ? 99 : (i == -1 ? 11 : 22);

    这时问题就出现了,有些人会对后面括号中的表达式先进行运算,得到结果为22,然后再计算整个表达式,最终得到的结果是 n = 22。

    但是运行结果却是 n = 11,这是为什么呢?

    究其原因,实际上就是将运算符的结合性与表达式的运算顺序这两个概念弄混了。

    就上面这个语句来说,运算符的右结合性只是说明这个表达式等价于

    int n = (++i == 0 ? 99 : i == -1) ? 11 : 22;

    而不是

    int n = (++i == 0 ? 99 : i == -1) ? 11 : 22;

    结合性仅仅是定义了多个相同优先级的运算符和与之相关的操作数(操作符)的结合顺序,而并没有规定那个子表达式先运行。

    换一种说法,结合性和优先级只是定义表达式的结构,当确定表达式运行时的行为时才需要表达式各部分的运算顺序。

    C语言对于大多数的运算符没有规定运算顺序,只明确规定了条件表达式(三目运算符)、逻辑与 &&、逻辑或 || 以及逗号运算符的运算顺序(看到逻辑与&& 和 逻辑或 || 运算符是不是想到了什么?对,就是“短路求值”!)。

    C语言对于条件表达式(三目运算符)的运算顺序规定为:条件表达式首先对条件部分求值,若条件部分为真,则对问号之后冒号之前的部分求值,并将求得的结果作为整个表达式的结果值,否则对冒号之后的部分求值并作为结果值。

    再回到之前的问题看一下,了解了吧~~

    总结一下:C语言编译器对于一个表达式进行编译处理时,首先需要确定表达式的结构,这时用到了运算符的优先级和结合性,然后再确定表达式运行时的行为(表达式各部分的运算次序)这里用到了运算符的运算顺序(求值顺序)。

    这里需要理解的重点就是优先级、结合性、表达式各部分的运算顺序是不同的概念!

    展开全文
  • 语法用 BNF (wiki)表示。为了便于学习者理解,会提到左结合、右结合,但是它描述有些复杂运算符时候有些困难,比如 ?: 。z = (a == b ? a : b ? c : d);C 语言关于 ?: 语法这样定义:conditional-...

    先说结合性

    严格地讲 C 语言本身没有结合性(与优先级)的概念。它的语法是用 BNF (wiki)表示的。为了便于学习者理解,会提到左结合、右结合,但是它描述有些复杂的运算符的时候有些困难,比如 ?: 。

    z = (a == b ? a : b ? c : d);

    C 语言关于 ?: 的语法是这样定义的:

    conditional-expression : logical-OR-expression ? expression : conditional-expression

    ? 前面是一个 "logical-OR-epxression",而 a==b ? a : b 不能解释为 "logical-OR-expression" 。所以,没有 () 的情况下,不会将 a==b ? a : b 结合在一起。

    a = b = c

    关于 "assignment expression" ,有如下规则:

    assignment-expression : unary-expression assignment-operator assignment-expression

    "assignment-operator" 左侧必须是一个 "unary-epxression" 。a 是 unary-expression ,但是 a = b 不是。所以必然后右侧的 b = c 结合为一个 "assignment-epxression" 。

    所有的规则可以参考 C11标准草案 附录A 。

    再说执行顺序

    C 语言并不是先结合在一起的就会先执行的。

    在同一个表达式内,除非有特殊规定,或者有依赖,否则求值顺序是不一定的。

    对于

    conditional-expression : logical-OR-expression `?` expression `:` conditional-expression

    其中的 logical-OR-expression 一定是最先执行的。然后,根据其结果,选择 expression 与 conditional-epxression 之一执行。

    在这里,

    c == 0? printf("1\n"):(c=2)?(c = 3):printf("4\n")

    c==0 先执行,然后(由于其结果是 true)执行 printf("1\n") 。

    (c=2)?(c = 3):printf("4\n") 虽然被结合在了一起,但是作为外层 ?: 的一部分,根本没有执行。

    展开全文
  • c语言表达式语法规则是什么C语言表达式语法规则如下:推荐学习:c语言视频教程(1)C源程序是由一个主函数和若干个其它函数组成。(2)函数名后必须有小括号,函数体放在大括号内。c语言给数组赋值3种形式_后端开发...

    c语言统计单词个数的方法_后端开发

    在一篇文章中单词都是用空格隔开的,所以单词个数=空格数+1,c语言统计单词个数实际上转换成了统计文章中的空格数,可以用while和if来进行统计。

    af92df975d122a12eaf31086ddbe6c2e.png

    c语言表达式语法规则是什么

    C语言表达式语法规则如下:

    推荐学习:c语言视频教程

    (1)C源程序是由一个主函数和若干个其它函数组成的。

    (2)函数名后必须有小括号,函数体放在大括号内。c语言给数组赋值的3种形式_后端开发

    c语言给数组赋值的3种形式:1、通过循环的形式,即数组名[下标];2、通过循环的形式,即数组名+下标;3、通过循环的形式,利用指针对数组的元素进行依次赋值。

    (3)C程序必须用小写字母书写。

    (4)每句的末尾加分号。

    (5)可以一行多句。

    (6)可以一句多行。

    (7)可以在程序的任何位置加注释。 一个完整的C语言程序,是由一个main()函数(又称主函数)和若干个其它函数结合而成的,或仅由一个main()函数构成。

    更多编程入门相关知识,请关注ki4网!

    展开全文
  • C语言自增表达式

    2020-03-24 10:43:55
    先简单看下两个程序代码 int i=1,m; m=++i; printf("%d,%d",m,i); int i=1,m; m=i++;...printf("%d,%d",m,i);...如果你对于自加和自减不熟悉话,完全有...最开始时候我也一直在想++i和i++有他喵的什么区别啊。后来...

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处
    本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105066295

    先看以下程序代码

    int i=1,m;
    
    m=++i;
    
    printf("%d,%d",m,i);
    
    int i=1,m;
    
    m=i++;
    
    printf("%d,%d",m,i);
    

    ++i和i++ 程序分析

    如果你对于自加和自减不熟悉的话,完全有可能认为两个程序输出的m值是一样的,但实际情况下m的值是不同的。第一个程序代码中输出的m值是2而另一个输出的值是1。

    最开始的时候我也一直在想++i和i++有他喵的什么区别啊。后来想清楚过后发觉区别还是蛮大的哈。

    首先++i你完全可以这样来理解++i可以拆分成这样两个等式:

    i+=1和m=i怎么来解释喃,观察力好的朋友会发现在这个等式(m=++i)这个等式中所有的

    运算符都是单目运算符,也就是说我们不能按照自左至右的方式来计算,而应该

    采用自右至左的方式来运算。所以++i应该这样来看+(+i)。同理自减也是一样的区分

    相比这样来理解,你应该知道是怎么回事的吧。如果还没有理解请向下看。

    举个例子

    假如你在采苹果篮子里的苹果树就代表m的值,++i就相当于你采了一个但是没有立马放进去,而是等着采了第二个才放进篮子,所以篮子里的数是从2逐渐加1。与之不同的i++就可以这样理解你采了一个苹果就放进了篮子,所以篮子里的数是从1逐渐递增的。

    展开全文
  • 文章参考微信公众号[嵌入式软件学习圈] 四、C语言复杂表达式 4.1、在表达式中,要看符号优先级和结合...也可以这样想:凡是遇到(*p)什么的判断他指针后,就可以说他指针变量,包括函数指针。 4.4、一个函数i...
  • C语言正则表达式求解

    2021-04-30 19:48:27
    <code>char pattern[50] = "\\s*\033]0;(.*)\a"; ret = regcomp(&reg, pattern, flags);</code></pre> ...请求这个pattern匹配到底是什么特征字符串。实在是看不明白,谢谢</p>
  • 对于左操作数必须左值理解不到,什么算左值,该如何使用和放置左值。为什么12=i; i+j=0; -i=j;会报错。 单独看i++与++i i–与--i能够看懂,但是如果一起使用就理解不了,比如: i=1; j=2; ++i + j++; ...
  • 这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。这个题目手算很麻烦,因为明明对计算机编程很感兴趣...
  • 表达式:表达式是c语言的主体,在c语言中,表达式由操作符和操作数组成。简单的表达式可以只有一个操作数。根据操作符的个数,可以将表达式分为简单表达式和复杂表达式,简单的表达式只含有一个操作符(如:5+5),...
  • 表达式求值顺序一部分由操作符优先级和结合性决定。 同样,有些表达式的操作数在求值过程中可能需要转换为其他类型。 隐式类型转换 C整型算术运算总是至少以缺省整型类型精度来进行。 为了获得这个...
  • 之前深深沉陷于中缀转前缀和后缀规则,总是比较晕,那么有一个比较好方法可以不用再去想那些规则,想写下来与大家分享。    1....前缀和后缀是什么呢?  举个例子: +34 3+4  34+  
  • C语言指针表达式(图解)

    千次阅读 2015-01-19 13:55:43
    C语言软件编程的基础,不管你使用什么语言都会有必要用上...指针是C语言的灵魂,指针有各种各样的表达式,那么就让我们来学习一下,这些表达式和配图都来自《C与指针》。 我们从一个最简单的指针使用讲解: c
  • C语言中缀表达式求值(综合)

    千次阅读 多人点赞 2019-04-13 10:59:06
    题前需要了解:中缀、后缀表达式是什么?(不知道你们知不知道,反正我当时不知道,搜百度) 基本思路:先把输入中缀表达式→后缀表达式→进行计算得出结果 栈:”先进先出,先进后出“! 中缀转后缀(先把...
  • 遗憾的是并不通用:ps:我也不知道为什么失败 问题1:正则表达式或运算消除标签大小写后匹配不到字符串 问题2:正则表达式实现零宽断言后发现匹配不到字符串 问题3:在科大官网上测试成功 在其他网站可能会失败 ...
  • 大概就是: ``` int a=1,b=1,c=2; a++||b++&&c++;...这样得出结果为:2,1,2 ...或后面被全部短路 ...得出结果为:1,1,3 ...想问问大佬们短路原理是什么,为什么会出现上述两端代码情况。
  • C语言表达式 a+++++b 含义

    万次阅读 2012-11-14 15:44:05
    看到这个怪异的表达式,你的第一感觉是什么结果呢?你或许会这样组合:(a++)+(++b),或者这样组合:((a++)++)+b。哪一个表达式正确呢?C语言的操作符优先级是“++”高于“+”,所以第二个组合是正确的。那结果是什么...
  • c语言六种基本语句:1、表达式语句;2、标签语句;3、循环语句;4、复合语句;5、跳转语句;6、选择语句。C程序执行部分由语句组成。 程序功能也由执行语句实现。C语句可分为以下五类:1.表达式语句2....
  • 我们或多或少都有过,或者见过将赋值表达式参与运算情况。这通常会伴随着一些意想不到问题。今天我就见到了一段奇怪代码: #include<stdio.h> int main() { int a =5; int b = (a=2)+(a=3); ...
  • 思路这样:首先,将先序表达式转化成二叉树,其次,用后序来遍历二叉树,最后,通过后序遍历二叉树结果来计算最终结果。 那么问题来了,为什么我们要通过后序表达式来计算最终结果。这因为后序表达式我们...
  • C语言的基本数据类型数值型:整型数,浮点数,布尔数,复数和虚数。非数值型:字符。整数最基本的int,由此引出许多变式诸如有符号整数signed、无符号整数unsigned、短整数short、长整数long等,前两个根据是否有...
  • 包括括号运算(粘贴修改部分)int Judge_optr(char top)//用于判断字符ch是否运算符{int x;//cout << top << "test" << endl;switch (top){case '(':x = 0; break;case '+':case '-':x = 1; break...
  • 自己找一些代数式写出对应的C语言表达式。 编程求圆锥体体积。(个人作业) 编程求扇形面积。(个人作业) 结合数学问题用C编程求解(不少于三题,个人作业) * * * * * * * * * * * * * * * * * * * * * * * * * * * *...
  • C语言——逗号表达式

    2021-01-11 21:30:45
    简单来说就是,逗号表达式是C语言提供一种特殊运算符——逗号运算符。它优先级别最低,它将两个及其以上式子联接起来,从左往右逐个计算表达式,整个表达式值为最后一个表达式值。 下面通过一个典型程序来...
  • 因博主删掉指出该文错误的评论而发。 对于返回值不为void的函数,对它的正确调用也是表达式。...这胡扯,返回值类型为void的函数调用也是表达式 ...以下C语言中的运算符 ...狗屁不通,这个根本不是C语言的运...
  • printf("请输入A、B、C三名学生分数:"); scanf("%d %d %d",&score1,&score2,&score3); if(score1>score2) if(score2>score3) printf("B,score2=%d\n",score2); else if(score1>score3) printf("C,score3=%d\n",...
  • 优质回答 回答者:LionelWSE从右向左算首先a12第一步:计算a*=aa=a*a=144第二步:计算a-=144a=a-144=0第三步:计算a+=0a=a+0=0-----------------------------------------------------------------回答者:...
  • 凡是有值是表达式。具体包括:数字,标识符,字符常量,字符串常量,函数调用,以及以上几种用运算符组合起来。 如a,a++,a+b,"dfsaf",f().... 表达式后面加一个分号就构成了表达式语句。 为什么要用表达式...
  • , c语言while循环的表达式c语言中while是什么意思啊? , c语言while循环的表达式匿名网友:事例程序:void main(void){while(1){P2=0xfc;P2=0x00; }……}while(1)表示无限循环的执行它{ }内的语句,如果写成while(2)...
  • C语言基础——表达式

    2019-07-26 12:46:27
    目录 回顾: 一、定义概念: 二、表达式的分类 ...在上一篇博客中我们通过一个羞羞小故事了解了什么“常量”什么是“变量”。我们了解到了变量有什么用,应该怎么使用。对,变量可以用来表示一个常量,可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,177
精华内容 470
关键字:

c语言的表达式是什么

c语言 订阅