1. 主页
  2. 文档
  3. C语言教程
  4. C语言运算符
  5. ++*p、*p++ 和 *++p 之间的区别

++*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;
}

通过记住以下关于后缀 ++、前缀 ++ 和 *(取消引用)运算符的简单规则,可以很容易地猜出上述程序和所有此类程序的输出 
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 ”。

 

 

这篇文章对您有用吗?