9

我收到此 C 表达式的警告:

*p0++ = mult(*p0, psign[i1]); 

警告是:

unsequenced modification and access to 'p0' [-Wunsequenced]

我认为表达式应该修改为:

*p0 = mult(*p0, psign[i1]);
p0++;

行为(修改后)是否符合预期?我认为指针增量应该在 p0 指向的值被更新之后发生。

4

1 回答 1

15

您在上面提供的代码段会调用未定义的行为。根据C标准

C11:6.5 表达式:

如果标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量对象的值的值计算是未排序的,则行为未定义。如果表达式的子表达式有多个允许的排序,则如果在任何排序中出现这种未排序的副作用,则行为未定义。84) .

在表达式中,对赋值运算符左侧*p0++ = mult(*p0, psign[i1])的修改在表达式右侧的使用之前或之后没有排序。因此,片段p0p0

*p0++ = mult(*p0, psign[i1]);   

不等于

*p0 = mult(*p0, psign[i1]);
p0++;                       // Side effect to p0 is guaranteed after the use  
                            // of p0 in mult function
于 2015-08-14T19:48:23.410 回答