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

预测以下C程序的输出。

null

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


C

// 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;
}


C

// 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) postfix++的优先级高于*和prefix++。postfix++的关联性是从左到右的。 (参考: 优先表 ) 表情 ++*p 有两个优先级相同的运算符,所以编译器会查找关联性。运算符的关联性是从右向左的。因此,表达式被视为 ++(*p) .因此,第一个程序的输出为“ arr[0]=11,arr[1]=20,*p=11 “. 表情 *p++ 被视为 *(p++) 因为postfix++的优先级高于*。因此,第二个程序的输出为“ arr[0]=10,arr[1]=20,*p=20 “. 表情 *++p 有两个优先级相同的运算符,所以编译器会查找关联性。运算符的关联性是从右向左的。因此,表达式被视为 *(++p) .因此,第三个程序的输出为“ arr[0]=10,arr[1]=20,*p=20 “. 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享