考虑 C 代码a = a = a
。没有用于赋值的序列点,因此此代码在编译有关未定义操作的警告时会产生警告a
.
可能的值是什么a
这里可以有吗?这好像是a
不可能改变价值观。这里实际上是否存在未定义的行为,或者编译器只是懒惰?
序列点违规的未定义行为规则对于“值无法更改”的情况不例外。没有人关心价值是否改变。重要的是当你做任何事情时write访问变量,你是修改那个变量。即使您为变量分配了它已经保存的值,您仍然对该变量执行修改。如果多个修改没有用序列点分隔,则行为是未定义的。
人们可能会争辩说,这种“非修改性修改”不应引起任何问题。但语言规范本身并不关心这些细节。同样,用语言术语来说,每次将某些内容写入变量时,您都在修改它。
此外,您在问题中使用“模棱两可”一词这一事实似乎意味着您认为该行为是未指定。 IE。如“变量的结果值是(或不是)不明确的”。然而,在序列点违规中,语言规范并不局限于声明结果是未指定。它更进一步并声明了行为不明确的。这意味着这些规则背后的基本原理不仅仅考虑某些变量的不可预测的最终值。例如,在某些假想的硬件平台上,非顺序修改可能会导致编译器生成无效代码,或类似的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)