c - 分配和序列点 : how is this ambiguous?

标签 c compiler-construction sequence-points

考虑 C 代码 a = a = a。没有用于分配的序列点,因此此代码在编译时会产生有关 a 上未定义操作的警告。

a 在这里可能有哪些值? a 似乎无法更改值。这里实际上有未定义的行为还是编译器只是懒惰?

最佳答案

序列点违规的未定义行为规则不对“值不能改变”的情况进行异常(exception)处理。没有人关心值(value)是否改变。重要的是,当您对变量进行任何类型的写入访问时,您就是在修改该变量。即使您正在为变量分配一个它已经拥有的值,您仍然在对该变量进行修改。如果多个修改没有被序列点分隔,则行为未定义。

有人可能会争辩说,这种“非修改性修改”不应该造成任何问题。但是语言规范并不关心这些细节。同样,在语言术语中,每次您将内容写入变量时,您都在修改它。

此外,您在问题中使用“模棱两可”一词的事实似乎暗示您认为该行为未指定。 IE。如“变量的结果值是(或不是)不明确的”。但是,在违反序列点的情况下,语言规范并不局限于声明结果未指定。它走得更远,并声明了 undefined 行为。这意味着这些规则背后的基本原理不仅仅考虑了某些变量的不可预测的最终值。例如,在一些虚构的硬件平台上,非顺序修改可能会导致编译器生成无效代码,或类似的事情。

关于c - 分配和序列点 : how is this ambiguous?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13714246/

相关文章:

c - 虚拟 tty 中的管道使用

c - 确定一个数字是否是素数而不使用循环和突变?

c - "error: expected identifier or ' ( ' before ' { ' token"在 pthread.h 上编译 64 位时

c - 链接器如何解决动态可加载库中的重复符号?

c - 什么范围的机器的二进制兼容性?

c++ - 是在索引一个新的 map 元素并将读取它的东西分配给它未定义的行为,还是只是未指定的?

c - 为什么这些构造使用前后递增的未定义行为?

用于指针算术警告的 c gcc 编译器选项

c++ - 这个函数定义是如何工作的?

c++ - 未定义的行为和顺序点