C 括号内的运算符优先级
我对以下代码的理解是,C 括号内的运算符优先级,c,pointers,operator-precedence,C,Pointers,Operator Precedence,我对以下代码的理解是,ip在第二个printf语句中递增;然后,检索*ip指向的值。但结果显示情况并非如此 #include <stdlib.h> #include <stdio.h> int main() { int i[2] = { 1, 4 }; int *ip; ip = i; printf("%d\n", *ip); printf("%d\n", *(ip++)); printf("%d\n", *ip);
ip
在第二个printf
语句中递增;然后,检索*ip
指向的值。但结果显示情况并非如此
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i[2] = { 1, 4 };
int *ip;
ip = i;
printf("%d\n", *ip);
printf("%d\n", *(ip++));
printf("%d\n", *ip);
return 0;
}
然后,通过更改为预增量运算符,++ip
,出现了预期的结果
带预增量的代码
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i[2] = { 1, 4 };
int *ip;
ip = i;
printf("%d\n", *ip);
printf("%d\n", *(++ip));
printf("%d\n", *ip);
return 0;
}
我对C中运算符优先级的理解是
()
的优先级高于*
运算符。话虽如此,为什么增量后操作符ip++
没有首先求值-因为它在()
中,无论求值顺序如何,++ip
在返回ip的新值之前递增,而ip++
返回ip的旧值,然后递增。(或者,如果愿意,保存旧值,增加ip,然后返回旧值。)
这就是增量前后的差异
在两个示例中,括号都是多余的
我对以下代码的理解是,ip在第二个printf语句中递增;然后,检索*ip指向的值
实际上情况正好相反,请参见第二个printf中的注释代码:printf(“%d\n”,*(ip++”)代码>
首先,增量前后运算符的优先级都高于*运算符,因此*ip++
完全等同于*(ip++)
,而*+++ip
也完全等同于*(++ip)
然后让我们看一下递增运算符前后的区别:++i
的值等于i+1
,而i++
等于i
,尽管在这两种情况下,计算*-increment运算符后,i
的值增加1。使用规则-只需在一行代码上执行一件事。坚持这一点你不会犯太大的错误。这只是增量后的行为方式,与优先级无关。@EdHeal这只是测试我这个问题的一些临时代码。可能重复“为什么增量后操作符,ip++
,没有首先计算-因为它在()
中”--首先对其求值,但请记住,post fix运算符返回的是原始值,而不是更新后的值。
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i[2] = { 1, 4 };
int *ip;
ip = i;
printf("%d\n", *ip);
printf("%d\n", *(++ip));
printf("%d\n", *ip);
return 0;
}
1
4
4
int i[2] = { 1, 4 };
int *ip;
ip = i; // ip points to the first array element i[0]
printf("%d\n", *ip); // fetch ip and printf it (i[0] = 1)
printf("%d\n", *(ip++)); // 1) fetch ip and printf it (i[0] = 1), then 2) increment ip, which now points to i[1]
printf("%d\n", *ip); // fetch ip and printf it (i[1] = 4)