无序修改和访问指针
我收到了这个C表达式的警告:
*p0++ = mult(*p0, psign[i1]);
警告是:
unsequenced modification and access to 'p0' [-Wunsequenced]
我认为表达式应该修改为:
*p0 = mult(*p0, psign[i1]); p0++;
行为(修改后)是否符合预期? 我认为指针增量应该在p0指向的值更新后发生。
您在上面提供的代码段调用了未定义的行为。 根据C标准
C11:6.5表达式:
如果对标量对象的副作用相对于对同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未进行排序 ,则行为未定义。 如果表达式的子表达式有多个允许的排序,则如果在任何排序中发生这种未测序的副作用,则行为是不确定的。 84) 。
在表达式*p0++ = mult(*p0, psign[i1])
,在表达式右侧使用p0
之前或之后,对赋值运算符左侧的p0
的修改未按顺序排序。 因此,片段
*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