首页  >  文章  >  后端开发  >  为什么“i = i”被认为是 C 中的未定义行为?

为什么“i = i”被认为是 C 中的未定义行为?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-25 12:50:02777浏览

Why is

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn