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 ++)之后,在当前行执行后仍然执行了操作++.那么花括号()不起作用吗?或者它没有优先考虑增量后的事情?
++在右边返回值,然后再评估它.
printf("*q1++ = %d\n",*q1++);
Run Code Online (Sandbox Code Playgroud)
是相同的
printf("*q1++ = %d\n",*q1);
++q1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
441 次 |
| 最近记录: |