为什么 i=i++ 时 i 的值不增加;陈述?
Why does the value of i not increment for i=i++; statement?
代码:
for(int i=0;i<5;){
i=i++;
printf("%d",i);
}
上面的程序无限打印零,这怎么可能?
有语句i=i++;
。请解释为什么 i
的值不增加。
语句 i = i++
在 C 中是未定义的行为。简单地说,修改和使用同一个对象而没有插入序列点不能保证以您期望的任何方式工作。
如果您对 in-depth 调查感兴趣,ISO C 标准的附录 C 中涵盖了序列点。基本上,它们包括:
- 在函数调用和实际调用中的函数指示符和实际参数的计算之间。
- 在以下运算符的第一个和第二个操作数的计算之间:逻辑与
&&
;逻辑或 ||
;逗号 ,
.
- 在条件运算符
?:
的第一个操作数的求值与第二个和第三个操作数中的任何一个求值之间。
- 完整声明符结束。
- 在完整表达式的计算和下一个要计算的完整表达式之间。以下是完整的表达式: 一个不属于复合文字的初始值设定项;表达式语句中的表达式;选择语句的控制表达式(
if
或 switch
); while
或 do
语句的控制表达式;每个(可选)
for
语句的表达式; return
中的(可选)表达式
声明。
- 紧接在库函数之前 returns。
- 在与每个格式化的 input/output 函数转换说明符关联的操作之后。
- 在每次调用比较函数之前和之后,以及在对比较函数的任何调用与作为参数传递给该调用的对象的任何移动之间。
代码:
for(int i=0;i<5;){
i=i++;
printf("%d",i);
}
上面的程序无限打印零,这怎么可能?
有语句i=i++;
。请解释为什么 i
的值不增加。
语句 i = i++
在 C 中是未定义的行为。简单地说,修改和使用同一个对象而没有插入序列点不能保证以您期望的任何方式工作。
如果您对 in-depth 调查感兴趣,ISO C 标准的附录 C 中涵盖了序列点。基本上,它们包括:
- 在函数调用和实际调用中的函数指示符和实际参数的计算之间。
- 在以下运算符的第一个和第二个操作数的计算之间:逻辑与
&&
;逻辑或||
;逗号,
. - 在条件运算符
?:
的第一个操作数的求值与第二个和第三个操作数中的任何一个求值之间。 - 完整声明符结束。
- 在完整表达式的计算和下一个要计算的完整表达式之间。以下是完整的表达式: 一个不属于复合文字的初始值设定项;表达式语句中的表达式;选择语句的控制表达式(
if
或switch
);while
或do
语句的控制表达式;每个(可选)for
语句的表达式;return
中的(可选)表达式 声明。 - 紧接在库函数之前 returns。
- 在与每个格式化的 input/output 函数转换说明符关联的操作之后。
- 在每次调用比较函数之前和之后,以及在对比较函数的任何调用与作为参数传递给该调用的对象的任何移动之间。