c语言表达式有时候从左向右,C语言的条件表达式从右向左结合怎么理解

先说结合性

严格地讲 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") 虽然被结合在了一起,但是作为外层 ?: 的一部分,根本没有执行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值