首页  >  文章  >  后端开发  >  ## 为什么 `i = i ` 在 C 中是未定义行为?

## 为什么 `i = i ` 在 C 中是未定义行为?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-26 02:34:02737浏览

## Why is `i = i  ` Undefined Behavior in C  ?

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

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