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

本文详细探讨了C语言中运算符的结合性和执行顺序,指出C语言的?:运算符解析复杂,a=b=c的赋值规则,并强调了在没有括号的情况下,a==b?a:b不会被结合。同时,说明了C语言表达式的求值顺序并不总是从左到右,?:运算符的执行顺序为先判断条件再执行相应部分。最后,提到了C11标准草案中的相关规则作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说结合性

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值