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

Is this an undefined behavior in C?

我是 运行 我在 gcc 上的 C 代码,以了解 pre/post 递增运算符。 然而,我看到的结果并不是我所期望的。就像第 6 行一样,因为 i 是 5,所以它应该是

8 7 6 5 5

但是8 7 6 5 8

然后来到最后一行,显示14 14 14 14。有人可以解释这种行为吗?我曾预料 14 14 13 12

这个编译器依赖吗? printf函数在序列点上的行为是否未定义?

#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);

}

标准规定

Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.

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

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

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

  • 在函数调用时(在计算所有参数之后,以及 就在实际调用之前)。

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

检查 this and this 以获得更好的理解。

printf("%d %d %d %d %d \n", i, i++, i++, i++, i); 中,您在两个序列点之间多次写入同一内​​存位置,因此调用 undefined behaviour.