拿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++) 之后,操作 ++ 在当前行执行后仍然执行。那么大括号 () 不起作用吗?还是没有对后期增量的东西给予偏好?