括号内的运算符优先级

时间:2016-01-24 06:51:56

标签: 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);

    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++不首先被评估 - 因为它在()内。

3 个答案:

答案 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。