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

时间:2017-11-20 04:44:22

标签: c post-increment pre-increment

我在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);

}

1 个答案:

答案 0 :(得分:6)

标准规定

  

在前一个和下一个序列点之间,一个对象应该具有它   通过表达式的评估,最多修改一次存储值。   此外,只能访问先前值以确定   值存储。

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

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

  • 位于||&&?:和逗号运算符;以及

  • 在函数调用中(在评估所有参数之后,和 就在实际通话之前)。

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

检查thisthis以便更好地理解。

printf("%d %d %d %d %d \n", i, i++, i++, i++, i);中,您在两个序列点之间多次写入相同的内存位置,从而调用undefined behaviour