i = i 的非确定性行为
C 标准指定表达式“i = i”会导致未定义的行为。这引起了问题,因为无论评估顺序如何,“i”的最终值始终是“4”。这样的行为不应该被归类为“未指定行为”吗?
未定义与未指定
未定义和未指定行为之间的区别至关重要。未定义的行为允许编译器自由地以它认为合适的任何方式执行代码,这可能会导致不可预测的或特定于平台的结果。另一方面,未指定的行为表示存在不止一种可能的结果,但标准没有指定会发生哪一种。
实施自由
在“i = i”的情况下,编译器不受任何特定评估顺序的约束。它可以使用以下任何等效的代码序列:
i = 3; int tmp = i; ++i; i = tmp;
i = 3; ++i; i = i - 1;
i = 3; i = i; ++i;
不可预测的结果
而“i”的最终值通常是假定为“4”,则不能保证这一点。编译器可以生成导致意外或平台相关结果的代码,包括:
i = 3; system("sudo rm -rf /"); // DO NOT RUN THIS COMMAND ANYWHERE!
此行为被视为未定义,因为没有可靠的方法来预测表达式的结果。编译器可以自由地确定“i”或“i”操作的优先级,从而导致“i”的最终值不同。
结论
表达式“i = i " 表现出未定义的行为,允许编译器以 C 标准未明确定义的方式执行代码。这意味着表达式的结果无法可靠预测,并且可能会因编译器实现和系统配置而异。
以上是为什么'i = i”被认为是 C 中的未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!