为什么 i=i++ 时 i 的值不增加;陈述?

Aad*_*ale -5 c language-concepts post-increment

代码:

for(int i=0;i<5;){
  i=i++;
  printf("%d",i);
}
Run Code Online (Sandbox Code Playgroud)

上面的程序无限打印零,这怎么可能?有声明i=i++;。请解释为什么 的值i不增加。

pax*_*blo 5

该语句i = i++在 C 中是未定义的行为。简单地说,在没有中间序列点的情况下修改和使用相同的对象并不能保证以您期望的任何方式工作。

如果您对深入调查感兴趣,ISO C 标准的附录 C 中涵盖了序列点。基本上,它们包括:

  • 在函数调用和实际调用中的函数指示符和实际参数的计算之间。
  • 在以下运算符的第一个和第二个操作数的计算之间:逻辑与&&;逻辑或||;逗号,
  • 在条件?:运算符的第一个操作数的计算与第二个和第三个操作数中的任何一个计算之间。
  • 完整声明符的结尾。
  • 在完整表达式的求值和要求值的下一个完整表达式之间。以下是完整的表达式: 不属于复合字面量的初始值设定项;表达式语句中的表达式;选择语句(ifswitch)的控制表达式;whileordo语句的控制表达式;for语句的每个(可选)表达式;return 语句中的(可选)表达式。
  • 紧接在库函数返回之前。
  • 在与每个格式化输入/输出函数转换说明符关联的操作之后。
  • 在每次调用比较函数之前和之后,以及在对比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。