我对以下代码的理解是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;
}
输出:
1
1
4
然后,通过更改为预增量运算符++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;
}
输出:
1
4
4
我对C中运算符优先级的理解是()
的优先级高于*
运算符。话虽如此,为什么后增量运算符ip++
不首先被评估 - 因为它在()
内。
答案 0 :(得分:3)
无论评估顺序如何,++ip
在返回ip的新值之前递增,而ip++
返回ip的旧值,然后递增它。 (或者,如果您愿意,可以保存旧值,增加ip,然后返回旧值。)
这是增量前后的差异。
在两个示例中,括号都是多余的。
答案 1 :(得分:1)
我对以下代码的理解是ip在第二个printf语句中递增;然后,检索* ip指向的值。
实际上反过来,请参阅第二个printf上的注释代码:printf("%d\n", *(ip++));
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)
答案 2 :(得分:0)
首先,增量前和增量后运算符的优先级都高于*运算符,因此*ip++
完全等同于*(ip++)
,而*++ip
也完全等同于*(++ip)
{1}}。
然后让我们看看增量前和增量后算子之间的区别:++i
的值等于i+1
,而i++
等于i
,尽管在任何一种情况下,{ - 1}}的值在评估* -increment运算符后都会增加1。