考虑c代码a = a = a
。没有可赋值的序列点,因此在编译a
上的未定义操作时,此代码会产生警告。a
可能有哪些值?似乎a
无法更改值。这里是否有未定义的行为,或者编译器只是懒惰?
最佳答案
对于“值无法更改”的情况,序列点冲突的未定义行为规则不会产生异常。没有人在乎价值观是否会改变。重要的是,当您对该变量进行任何类型的写访问时,您都在修改该变量。即使您为变量分配一个它已经保存的值,您仍然在执行对该变量的修改。如果多个修改没有被序列点分隔,则行为是未定义的。
有人可能会说,这样的“非修改性修改”不应该引起任何问题。但语言规范本身并不关心这些细节。同样,在语言术语中,每次将某个内容写入变量时,都要对其进行修改。
此外,你在问题中使用“模棱两可”这个词似乎意味着你认为这种行为是不明确的。即,如“变量的结果值是(或不是)不明确的”。但是,在序列点冲突中,语言规范不限制自己声明结果未指定。它更进一步,并声明行为未定义。这意味着这些规则背后的基本原理考虑的不仅仅是某个变量的不可预测的最终值。例如,在某些虚构的硬件平台上,非顺序修改可能导致编译器生成无效代码,或类似的情况。