以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那么,操作符的优先级不是从右向左发生的吗?还是我的理解有什么不对?
更新
下面是thing.Even,如果我像前面提到的那样放置这些括号,那么*(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++)之后,在当前行是executed.So之后,++操作仍然被执行,而executed.So没有工作吗?或者它没有优先于职位增值的事情?
发布于 2011-06-23 13:20:17
右边的++在计算值之前返回值。
printf("*q1++ = %d\n",*q1++);是相同的
printf("*q1++ = %d\n",*q1);
++q1;发布于 2011-06-23 13:19:16
不,操作人员不会从右到左被评估。有一个运算符优先表来下订单。
然而,这并不是你所看到的行为的原因。原因是您使用的是增量后运算符,这意味着在*q1++中,指针取消引用发生在添加之前的q1值上。
如果您将代码更改为读取*(++q1) (预增量操作符),您将看到所期望的行为。
发布于 2011-06-23 13:20:35
语句*ptr++;将首先计算ptr指向的值,然后递增ptr。若要先递增,请使用*++ptr;。
https://stackoverflow.com/questions/6454638
复制相似问题