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)