泛舟湖上清波郎朗
先说结合性严格地讲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")虽然被结合在了一起,但是作为外层?:的一部分,根本没有执行。