为了账号安全,请及时绑定邮箱和手机立即绑定

有没有童鞋遇到过同样的问题:C语言的条件表达式从右向左结合怎么理解谢谢哈~

有没有童鞋遇到过同样的问题:C语言的条件表达式从右向左结合怎么理解谢谢哈~

犯罪嫌疑人X 2019-11-03 09:35:52
例子:z=(a==b?a:b?c:d);我知道这个例子,从右向左结合的话,会是:z=(a==b?a:(b?c:d));从左向右结合的话,会是:z=((a==b?a:b)?c:d);另一个例子:a=b=c等价于a=(b=c)那我是不是可以理解成这个结合性相当于给先结合的东西加上括号,也就是优先级变高了。放到第一个例子里就是先计算b?c:d但是我用过下面这个例子测试intc=0;inttest=c==0?printf("1\n"):(c=2)?(c=3):printf("4\n");printf("%d",c);结果输出1,我知道按照规范不能再条件表达式中有赋值语句,但这只是为了测试执行顺序,结果说明它是先从最左边的1开始运算的。真诚求助!
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

先说结合性
严格地讲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
关于"assignmentexpression",有如下规则:
assignment-expression:unary-expressionassignment-operatorassignment-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")虽然被结合在了一起,但是作为外层?:的一部分,根本没有执行。
                            
查看完整回答
反对 回复 2019-11-03
?
森林海

TA贡献2011条经验 获得超2个赞

结合型只有在运算服优先级一样的情况下才起作用。
inttest=c==0?printf("1\n"):(c=2)?(c=3):printf("4\n");
上面其实外面是一个条件运算符,condition?expr1:expr2。其中:
condition:条件为c==0
expr1:为printf("1\n");
expr2:为(c=2)?(c=3):printf("4\n");,这又是一个条件运算符。
c==0为true,所以只有expr1执行,即printf("1\n"),所以会输出1。c未变,后一句printf("%d",c);会输出0。
                            
查看完整回答
反对 回复 2019-11-03
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信