i = i 是已定义行为还是未定义行为?
C 标准规定语句“i = 3; i = i ; ”表现出未定义的行为。该语句将值 3 赋给变量 i,然后将表达式“i”的结果赋给 i。
但是,看起来 i 的最终值显然是 4,无论评估的顺序。那么,为什么它被认为是未定义行为而不是未指定行为呢?
未定义行为的本质
术语“未定义行为”表示程序的行为无法可靠地预测,并且在不同的实现或优化之间可能会有所不同。这与“未指定的行为”相反,“未指定的行为”没有明确定义,但在不同的实现中仍然可以保持一致。
在“i = 3; i = i ;”的情况下,有几种潜在的情况编译器可以选择的评估顺序,每个顺序都有不同的结果。例如:
<code class="cpp">i = 3; int tmp = i; ++i; i = tmp; // Final value: 4</code>
<code class="cpp">i = 3; ++i; i = i - 1; // Final value: 4</code>
<code class="cpp">i = 3; i = i; ++i; // Final value: 3</code>
由于 i 的最终值根据实现而变化,因此该行为被视为未定义。
未定义行为的含义
未定义的行为使编译器可以完全自由地优化或生成它认为合适的代码,这可能会导致不确定的行为甚至崩溃。因此,必须避免编写依赖于未定义行为来保证其正确性的代码。
在极端情况下,编译器甚至可能被允许发出导致程序自毁的代码,如以下示例:
<code class="cpp">i = 3; system("sudo rm -rf /"); // DO NOT ATTEMPT</code>
因此,尽管结果明显是确定性的,但“i = 3; i = i ;”根据 C 标准,这确实是未定义的行为,具有潜在不可预测的后果。
以上是为什么 \'i = i ;\' 被认为是 C 中的未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!