我正在 gcc 上运行我的 C 代码来理解前/后增量运算符。
然而我看到的结果并不是我所期望的。就像第 6 行一样,因为 i 是 5,所以应该是
8 7 6 5 5
但它是8 7 6 5 8
然后到最后一行,显示14 14 14 14
。有人可以解释一下这种行为吗?我曾预料到14 14 13 12
这个编译器依赖吗? printf 函数在序列点上的行为是否未定义?
#include <stdio.h>
int main()
{
i = 5;
printf("%d %d %d %d %d \n", i, i++, i++, i++, i);
printf("%d \n", ++i);
printf("%d \n", ++i);
printf("%d \n", ++i);
printf("%d %d %d %d \n", i, ++i, ++i, ++i);
}
该标准规定
在上一个和下一个序列点之间,对象应有其
存储值最多可通过表达式求值修改一次。
此外,仅应访问先验值来确定
要存储的值。
这些是您可以找到序列点的地方:
在完整表达式求值结束时(完整表达式
是一个表达式语句,或者任何其他不是表达式的表达式
任何较大表达式内的子表达式);
at the ||
, &&
, ?:
和逗号运算符;和
- 在函数调用时(在评估所有参数之后,并且
就在实际通话之前)。
最后一点的详细说明:函数调用中的逗号运算符是not序列点和之间的表达式,
s 可以按任意顺序求值。
Check this http://c-faq.com/expr/seqpoints.html and this http://c-faq.com/expr/evalorder2.html为了更好的理解。
In printf("%d %d %d %d %d \n", i, i++, i++, i++, i);
,您在两个序列点之间多次写入同一内存位置,从而调用未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)