c语言 - "int a=4,*ptr=&a;"或"x+=4,y=x*2;"等语句是否存在"sequence-point"问题?



我对整个序列点的理解是基本的。我所拥有的只是一些粗略的直觉想法,即"一旦遇到序列点,我们可以确定之前评估的所有副作用都是完整的"。我还读到,在像printf("%d",a++,++a,a++)这样的语句中,行为是未定义的,因为逗号不表示序列点,而分号表示。因此,与其凭直觉进行猜测,我觉得一个非常严谨和确凿的答案会对我有很大帮助。

下面这类语句安全吗;在C:中确定

int a=4,*ptr=&a;  //Statement 1
x+=4,y=x*2;  //Statement 2  (Assume x and y are integer variables)

如果是,如何?特别是在第二种情况下,如果逗号不是序列点,那么在分配y=x*2之前,我们如何确保x已经增加了4?对于第一条语句,在将地址分配给ptr之前,我如何确保a已经初始化并分配了内存?我应该谨慎行事并使用以下方法进行上述操作吗:

int a=4,*ptr;
ptr=&a;

x+=4;
y=x*2;

编辑我对逗号运算符的理解告诉我这些语句是安全的。但在阅读了关于序列点以及类似printf("%d",a++,++a,a++)的东西是如何未定义的之后,我有了第二个想法。

在函数调用中分隔函数参数的逗号是,而不是逗号运算符-它只是碰巧与逗号运算符拼写相同的标点符号。不同函数参数的求值之间没有序列点,所以这就是为什么在这种情况下会得到UB。

另一方面,在你的表达中:

x+=4,y=x*2;

这里的逗号逗号运算符,它引入了一个序列点;没有UB。

在声明中,声明符之间的逗号也不是逗号运算符;但是,完整声明符(声明符不是另一个声明符的一部分(的末尾确实引入了一个序列点,因此像这样的声明

int a = 2, b = a + 1;

不是UB。

此处没有UB
按照C99标准:

C。附录C(资料性(:序列点
#1以下是5.1.2.3中描述的顺序点:
--参数求值后对函数的调用(6.5.2.2(。
--以下运算符的第一个操作数的末尾:逻辑AND&(6.5.13(;逻辑OR ||(6.5.14(;有条件的(6.5.15(;逗号,(6.5.17(.

因此,函数调用中不涉及逗号运算符。尽管存在逗号。

最新更新