📜  ++*p、*p++ 和 *++p 之间的区别

📅  最后修改于: 2021-09-11 03:50:39             🧑  作者: Mango

预测以下 C 程序的输出。

// PROGRAM 1
#include 
int main(void)
{
    int arr[] = {10, 20};
    int *p = arr;
    ++*p;
    printf("arr[0] = %d, arr[1] = %d, *p = %d",
                          arr[0], arr[1], *p);
    return 0;
}
// PROGRAM 2
#include 
int main(void)
{
    int arr[] = {10, 20};
    int *p = arr;
    *p++;
    printf("arr[0] = %d, arr[1] = %d, *p = %d",
                          arr[0], arr[1], *p);
    return 0;
}
// PROGRAM 3
#include 
int main(void)
{
    int arr[] = {10, 20};
    int *p = arr;
    *++p;
    printf("arr[0] = %d, arr[1] = %d, *p = %d", 
                          arr[0], arr[1], *p);
    return 0;
}

通过记住以下关于后缀++、前缀++和*(解引用)运算符的简单规则,可以很容易地猜出上述程序和所有此类程序的输出
1)前缀++和*的优先级相同。两者的结合性是从右到左。
2)后缀++的优先级高于*和前缀++。 postfix ++ 的结合性是从左到右的。

(参考:优先级表)

表达式++*p有两个优先级相同的运算符,因此编译器会寻找关联性。运算符是从右到左。因此,表达式被视为++(*p) 。因此第一个程序的输出是“ arr[0] = 11, arr[1] = 20, *p = 11 ”。

表达式*p++被视为*(p++),因为后缀 ++ 的优先级高于 *。因此第二个程序的输出是“ arr[0] = 10, arr[1] = 20, *p = 20 ”。

表达式*++p有两个优先级相同的运算符,因此编译器会寻找关联性。运算符是从右到左。因此,表达式被视为*(++p) 。因此第三个程序的输出是“ arr[0] = 10, arr[1] = 20, *p = 20 ”。

想要从精选的视频和练习题中学习,请查看C 基础到高级C 基础课程