You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中变量赋值是否会打破运算优先级规则?

C语言表达式求值的坑:别把优先级和求值顺序混为一谈

你之前对运算符优先级的理解没错:比如乘法优先级高于加法,括号可以强制改变运算结构,赋值表达式也能作为右值使用——但你忽略了一个核心规则:优先级只管表达式的语法结构,不管操作数的求值顺序。

举个例子,int i = 3 * 2 + 4;之所以结果是10,是因为优先级让表达式被解析成(3*2)+4,但这并不意味着编译器一定会先算3*2再算4——只不过这里两种顺序结果一样,才让你误以为是左到右执行。

再看你说的合法场景:

int i;
int j = (i = 5) * 2;
// i == 5 且 j == 10

这里结果确定,是因为乘法运算必须依赖(i=5)的求值结果——编译器得先算出i=5的值(也就是5)才能做乘法,这是操作数的依赖关系导致的顺序,不是语言强制的左到右规则。

而你遇到的j=(i=5)+(i=6)得到12的情况,本质是未定义行为,问题出在两点:

  1. 加法的两个操作数(i=5)和(i=6),C标准完全没规定哪个先求值——编译器想先算哪个就先算哪个。
  2. 在同一条语句的序列点(也就是末尾的分号)之前,你对同一个变量i做了两次修改,这直接触发了未定义行为。

你得到12的结果,说明你的编译器可能先执行了(i=5),再执行(i=6),然后把两次赋值后的i值(也就是6)加了两次;或者它干脆优化成了i=6; j=6+6;——这都是未定义行为允许的操作。这种情况下,别纠结为什么是12,因为换个编译器、换个编译选项,结果可能变成11,甚至更奇怪的数值。

记住这条铁律:永远别在同一个序列点内多次修改同一个变量,也别默认操作数是左到右求值(只有&&、||、?:、逗号运算符这类少数运算符明确规定了求值顺序)。

内容的提问来源于stack exchange,提问作者Badasahog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:53:14