3

int ptr={10,20,30,40,50} 我理解

print("%d", *ptr++);

在这样的语句中,运算符的评估是从右到左的。因此,*ptr++++首先进行评估,然后ptr再进行评估* 所以为了确认相同的内容,我编写了一个程序

#include<stdio.h>
int main()
{
        int array[] = { 10, 20, 30, 40, 50 };
        int *q1 = array;
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1++);
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1);
}

上述程序的输出与上述逻辑预期的运算符优先级不同。我得到的输出是

q1 = 0x7ffffcff02e0
*q1++ = 10
q1 = 0x7ffffcff02e4
*q1++ = 20

但我期待

q1 = 0x7ffffcff02e0
*q1++ = 20
q1 = 0x7ffffcff02e4
*q1++ = 20

那么运算符优先级没有从右到左发生吗?还是我的理解有问题?

更新

现在事情就是这样。即使我按照提到的方式放置这些括号以便执行 *(ptr++) 输出也不会改变这里是新代码

#include<stdio.h>
int main()
{
        int array[] = { 10, 20, 30, 40, 50 };
        int *q1 = array;
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*(q1++));// note the braces here *(q1++) so that () get evaluated 
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1);
}

结果仍然与您提到的使用大括号相同。输出仍然是

q1 = 0x7fff043f2120
*q1++ = 10 <-- I expected *q1++ = 20//since I used braces ()
q1 = 0x7fff043f2124
*q1++ = 20

所以即使在我使用了大括号 *(ptr++) 之后,操作 ++ 在当前行执行后仍然执行。那么大括号 () 不起作用吗?还是没有对后期增量的东西给予偏好?

4

4 回答 4

7

不,运营商不会从右到左进行评估。有一个给出顺序的运算符优先级表

但是,这不是您所看到的行为的原因。原因是您使用的是后增量运算符,这意味着在*q1++指针中取消引用发生在加法之前q1值上。

如果您将代码更改为读取*(++q1)(预增量运算符),您会看到您期望的行为。

于 2011-06-23T13:19:16.270 回答
6

++右边的返回值它被评估之前。

printf("*q1++ = %d\n",*q1++);

是相同的

printf("*q1++ = %d\n",*q1);
++q1;
于 2011-06-23T13:20:17.087 回答
1

++变量名之后定义是一个后增量操作,这意味着在计算表达式之后指针前进。

x = *q++;

是相同的:

x = *q;
++q;

预增量等价物是:

x = *++q;

这将是:

++q;
x = *q;
于 2011-06-23T13:24:07.210 回答
1

该语句*ptr++;将首先计算 ptr 指向的值,然后递增 ptr。要首先递增,请使用*++ptr;.

于 2011-06-23T13:20:35.027 回答