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

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

标准规定了这一点

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

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

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

  • ||&&?:和逗号运算符; 和

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

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

检查这 一点,以便更好地理解。

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