c - 括号内的运算符优先级

标签 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++ 没有首先求值 - 因为它位于 () 内。

最佳答案

无论计算顺序如何,++ip 在返回 ip 的新值之前递增,而 ip++ 返回 ip 的旧值,然后递增它。 (或者,如果您愿意,可以保存旧值,增加 ip,然后返回旧值。)

这就是增量前和增量后的区别。

在您的两个示例中,括号都是多余的。

关于c - 括号内的运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34973030/

相关文章:

c - showbits() 函数

c - 从文件中读取单词并将其作为字符指针返回

c - 使用指针加密字符串的函数

c++ - 取消引用和后缀++优先级

c - C 中的隐式函数声明

c - 界面像c语言吗?

c - #include 在代码中间

c++ - 返回枚举数组的函数

javascript - 正确的 JavaScript 运算符优先级表是什么?

MySQL INSERT 和 SELECT 优先顺序