预测以下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