我在gcc上运行我的C代码来理解前/后增量运算符。 然而,我看到的结果并不是我所期望的。就像第6行一样,因为我是5,所以应该是
8 7 6 5 5
但它是8 7 6 5 8
然后到达最后一行,它显示14 14 14 14
。有人可以解释一下这种行为。我曾预料到
14 14 13 12
这个编译器是否依赖?是否未定义序列点上printf函数的beahviour?
#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);
}
答案 0 :(得分:6)
标准规定
在前一个和下一个序列点之间,一个对象应该具有它 通过表达式的评估,最多修改一次存储值。 此外,只能访问先前值以确定 值存储。
这些是您可以找到序列点的地方:
在评估完整表达式结束时(完整表达式 是一个表达式语句,或任何其他不是的表达式 任何较大表达式中的子表达式);
位于||
,&&
,?:
和逗号运算符;以及
最后一点的详细说明:函数调用中的逗号运算符是不序列点,,
s之间的表达式可以按任意顺序进行计算。
在printf("%d %d %d %d %d \n", i, i++, i++, i++, i);
中,您在两个序列点之间多次写入相同的内存位置,从而调用undefined behaviour。