例子: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")虽然被结合在了一起,但是作为外层?:的一部分,根本没有执行。
森林海
TA贡献2011条经验 获得超2个赞
结合型只有在运算服优先级一样的情况下才起作用。inttest=c==0?printf("1\n"):(c=2)?(c=3):printf("4\n");上面其实外面是一个条件运算符,condition?expr1:expr2。其中:condition:条件为c==0expr1:为printf("1\n");expr2:为(c=2)?(c=3):printf("4\n");,这又是一个条件运算符。c==0为true,所以只有expr1执行,即printf("1\n"),所以会输出1。c未变,后一句printf("%d",c);会输出0。
添加回答
举报
0/150
提交
取消