预测以下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基础课程》。