这是C中未定义的行为吗?

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)

bab*_*bon 6

标准规定了这一点

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.

这些是您可以找到序列点的地方:

  • 在完整表达式的评估结束时(完整表达式是表达式语句,或任何其他表达式,它不是任何更大表达式中的子表达式);

  • ||,&&,?:和逗号操作员; 和

  • 在函数调用(在所有参数的评估之后,以及在实际调用之前).

最后一点的详细说明:函数调用中的逗号运算符不是序列点,并且,可以以任意顺序计算s 之间的表达式.

检查这个这个更好的理解.

printf("%d %d %d %d %d \n", i, i++, i++, i++, i);,您在两个序列点之间不止一次写入相同的内存位置,从而调用未定义的行为.