Sha*_*rji 0 c pre-increment post-increment
我在gcc上运行我的C代码来理解前/后增量运算符.然而,我看到的结果并不是我所期望的.就像第6行一样,因为我是5,它应该是
8 7 6 5 5
Run Code Online (Sandbox Code Playgroud)
但它是 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);
}
Run Code Online (Sandbox Code Playgroud)
标准规定了这一点
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.
这些是您可以找到序列点的地方:
在完整表达式的评估结束时(完整表达式是表达式语句,或任何其他表达式,它不是任何更大表达式中的子表达式);
在||,&&,?:和逗号操作员; 和
最后一点的详细说明:函数调用中的逗号运算符不是序列点,并且,可以以任意顺序计算s 之间的表达式.
在printf("%d %d %d %d %d \n", i, i++, i++, i++, i);,您在两个序列点之间不止一次写入相同的内存位置,从而调用未定义的行为.