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