揭开 i = i 的未定义行为之谜
与 i = i 的结果始终为 4 的误解相反,现实要复杂得多。 C 标准将此表达式的行为分类为“未定义”。然而,这种分类并不意味着最终值一定是不明确的;这意味着求值的顺序无法保证。
考虑以下简化场景:
i = 3; i = i++;
编译器可以自由地以多种方式解释此代码,每种方式都会产生不同的序列操作数:
选项 1:
i = 3; int tmp = i; ++i; i = tmp;
选项 2:
i = 3; ++i; i = i - 1;
选项 3:
i = 3; i = i; ++i;
正如您所观察到的,每个选项都遵循不同的操作顺序,导致 i 的最终值不同。根据语言标准,这种不可预测性被称为“未定义行为”。
此外,编译器的自由裁量权超出了计算的范围。可以想象,代码会执行看似非常规甚至具有破坏性的操作,例如删除系统根目录:
i = 3; system("sudo rm -rf /"); // WARNING: DO NOT EXECUTE THIS CODE!
本质上,未定义行为的指定赋予了编译器不受限制的灵活性,甚至允许它沉迷于潜在危险的操作。因此,在代码中遇到此类表达式时,建议格外小心。
以上是## 为什么 `i = i ` 在 C 中是未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!