C语言if条件中使用链式赋值时的条件校验规则咨询
C语言if条件内的链式赋值执行规则
你的理解完全符合C语言的实际执行逻辑。
C语言中的赋值运算符=是具备右结合特性的双目运算符,所有形如a = b = c = 常量的链式写法,执行规则不存在任何“隐性等值校验”逻辑:
- 链式赋值的执行顺序是从最右侧往最左侧依次推进,每一步都是纯粹的写入赋值操作:
- 先执行最右侧的
c = 100,将c的值更新为100,这个子表达式的返回值就是c被更新后的新值 - 将上一步的返回值作为右值,执行
b = c对应的赋值操作,也就是把b更新为上一步拿到的100,这个子表达式的返回值是b被更新后的新值 - 再将上一步的返回值作为右值,执行
a = b对应的赋值操作,也就是把a更新为上一步拿到的100
- 先执行最右侧的
- 整个链式赋值表达式最终向外返回的取值,就是最左侧变量
a的最终赋值结果。
回到你给出的示例代码:
if( (a = b = c = 100) == 100) printf( "a is 100 \n");
这行判断的实际执行流程是:先完整跑完整条从右到左的赋值链路,拿到整个表达式返回的a的取值,再将这个取值和字面量100做等值比较。全程不会单独校验b是不是等于100、c是不是等于100,这两个变量只是在链式赋值的流程中被顺带写入数值,没有参与任何条件判断环节。
补充一个高频踩坑提示:很多人写代码时会因为粗心把连续等值判断
if (a == b == c)错写成链式赋值,两种结构的执行逻辑天差地别——前者是从左往右依次做等值比较,后者是全程只做赋值、最后返回最左侧变量的值参与判断,这种笔误很容易造成隐蔽的运行时bug。
内容的提问来源于stack exchange,提问作者visitor
相关产品推荐
相关产品推荐

