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

📅  最后修改于: 2021-05-25 18:39:49             🧑  作者: 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)后缀++的优先级高于*和前缀++。后缀++的关联性从左到右。

(请参阅:优先级表)

表达式++ * 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基础课程》。