这是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);
,您在两个序列点之间不止一次写入相同的内存位置,从而调用未定义的行为 。