++*p、*p++和*++p的区别

来源:这里教程网 时间:2026-02-16 13:49:15 作者:

++*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.

相关推荐