printf行为

Reg*_*ser 3 c pointers pointer-arithmetic

就拿int ptr={10,20,30,40,50} 我明白

print("%d", *ptr++);
Run Code Online (Sandbox Code Playgroud)

在这样的陈述中,对运营商的评估是从右到左.因此,在*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);
}
Run Code Online (Sandbox Code Playgroud)

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

q1 = 0x7ffffcff02e0
*q1++ = 10
q1 = 0x7ffffcff02e4
*q1++ = 20
Run Code Online (Sandbox Code Playgroud)

但我在期待

q1 = 0x7ffffcff02e0
*q1++ = 20
q1 = 0x7ffffcff02e4
*q1++ = 20
Run Code Online (Sandbox Code Playgroud)

那么运营商的优先权是不是从右到左发生的?或者我的理解有些不对劲?

UPDATE

现在就是这个东西.即使我把这些括号放在所说的*(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);
}
Run Code Online (Sandbox Code Playgroud)

结果仍然是你提到的使用括号的相同注意事项.输出仍然是

q1 = 0x7fff043f2120
*q1++ = 10 <-- I expected *q1++ = 20//since I used braces ()
q1 = 0x7fff043f2124
*q1++ = 20
Run Code Online (Sandbox Code Playgroud)

所以,即使在我使用大括号*(ptr ++)之后,在当前行执行后仍然执行了操作++.那么花括号()不起作用吗?或者它没有优先考虑增量后的事情?

Jon*_*Jon 7

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

但是,这不是您所看到的行为的原因.原因是,您使用的是后增运营商,这意味着*q1++该指针引用发生在该值q1之前加入.

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


Bli*_*ndy 6

++在右边返回值,然后再评估它.

printf("*q1++ = %d\n",*q1++);
Run Code Online (Sandbox Code Playgroud)

是相同的

printf("*q1++ = %d\n",*q1);
++q1;
Run Code Online (Sandbox Code Playgroud)