C语言中arr[val++] = val+=1表达式是否合法?如何求值?
关于C语言表达式
arr[val++] = val+=1的合法性与求值分析 合法性判定
这个表达式属于未定义行为,不符合C标准的规范。C标准明确规定:如果在同一个表达式中,对同一个变量的两次修改操作之间没有序列点分隔,整个表达式的行为就是未定义的——编译器可自由选择任意顺序执行操作,最终结果完全不可预测。
在arr[val++] = val+=1中,val++和val+=1都修改了变量val,而赋值运算符=左右两侧的求值顺序没有明确的序列点约束,因此这段代码的行为没有标准可依,不属于合法的、可移植的C代码。
GCC 14.2下的结果解释
你观察到数组第二个元素(索引1)的值为2,这只是GCC该版本下的一种特定执行结果,比如编译器可能选择先计算右侧的val+=1使val变为1,再以当前val的值作为数组索引执行val++(此时索引为1,随后val自增为2),最后将右侧表达式的结果赋值给数组对应位置。但这只是编译器的任意选择,换用其他编译器、同一编译器的不同版本或优化选项,结果可能完全不同(比如数组第一个元素被赋值为2,甚至出现其他无法预期的值)。
总结
- 该表达式属于未定义行为,不应编写此类代码,因为其行为没有标准保证,跨环境结果不一致。
- 编译器对未定义行为的处理不受标准约束,你看到的结果仅代表GCC 14.2的特定实现,不具备通用性。
内容的提问来源于stack exchange,提问作者tonyjosi
相关产品推荐
相关产品推荐

