预测以下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″。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
评论前必须登录!
注册