++*p
、*p++
和*++p
的区别
预测以下C程序的输出。
// PROGRAM 1
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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;
}
只要记住关于后缀++、前缀++和*
(dereference)操作符的简单规则,上述程序和所有这类程序的输出都很容易猜到
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
.