带有后缀增量运算符的C指针

时间:2017-12-01 05:49:01

标签: c

我对C指针上的postfix增量运算符有疑问,我的测试代码如下:

int main(void)
{
    int a[16] = {0};
    int *head = &a[0];
    int i;

    head++;

    for(i=0; i<15; i++)
    {
        *head++ = head[-1] + 2;
        printf("head[-1] = %d, a[%d] = %d\n", head[-1], i, a[i]);
    }
}

我用GCC 5.4编译它,结果如下:

head[-1] = 2, a[0] = 0

head[-1] = 2, a[1] = 2

...

head[-1] = 2, a[13] = 2

head[-1] = 2, a[14] = 2

我期望的是a[0]=0, a[1]=2, a[2]=4...

这是一种未定义的行为,如Using postfix increment in an L-value吗?

2 个答案:

答案 0 :(得分:1)

未定义的行为,但它不是因为后缀增量运算符。这是evaluation order的问题。

*head++ = head[-1] + 2;

没有规定head是先增加还是head[-1]先评估(之前排序)。 是您代码的UB部分。

来自community draft n1570,第6.5 / 2节:

  

如果对标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义

答案 1 :(得分:0)

*head++ = head[-1] + 2;调用undefined behaviour,因为在右侧使用head指针之前或之后,对赋值运算符左侧的head指针的修改未按顺序排序表达。

GCC编译器生成警告:

prog.c: In function 'main':
prog.c:12:14: warning: operation on 'head' may be undefined [-Wsequence-point]
         *head++ = head[-1] + 2;
          ~~~~^~

C11:6.5表达式:

  

如果相对于同一标量对象或值的不同副作用,对标量对象的副作用未被排序   使用相同标量对象的值进行计算,行为是   undefined。如果有多个允许的排序   表达式的子表达式,如果这样的话,行为是不确定的   任何顺序都会出现无序的副作用.84)。