Postfix对指针的一元增量操作

时间:2019-03-18 16:29:38

标签: c pointers operator-precedence

我刚开始使用 C Pointers 。关于指针的一元增量操作,有一个概念使我感到困惑。

int num1, *pnum1
num1 = 2;
pnum1 = &num1;
printf("%d \n before: " , *pnum1);
num1 = (*pnum1)++;
printf("%d \n after: " , *pnum1);
return 0;

由于 一元增量运算符 (++)的优先级高于 取消引用运算符 (*) ,我将 * pnum1 放在了括号内。我期望看到以下结果:

  

之后:3

但是它不会增加num1的值。为什么会这样呢?是不是应该增加num1的值?

1 个答案:

答案 0 :(得分:6)

这是未定义的行为。您要递增num1(通过(*pnum1)++),然后将结果分配回num1。在这种情况下,递增和赋值发生的顺序是不确定的,因此它可以获取num1的旧值,递增num1,然后将旧值分配回num1,这似乎就是编译器选择要做的事情。

如果改用num1 = num1++,则编译器可能会警告您。

解决方案是不要做这样的事情,因为它是不确定的行为。

查找“序列点”以获取更多信息。