面试题:++*p, *p++ 跟 *++p
面试题:++*p, *p++ 和 *++p
预测下面程序的输出:
01
|
//
PROGRAM 1
|
02
|
#include
<stdio.h>
|
03
|
int main( void )
|
04
|
{
|
05
|
int arr[]
= {10, 20};
|
06
|
int *p
= arr;
|
07
|
++*p;
|
08
|
printf ( "arr[0]
= %d, arr[1] = %d, *p = %d" ,
arr[0], arr[1], *p);
|
09
|
return 0;
|
10
|
}
|
11
|
//
PROGRAM 2
|
12
|
#include
<stdio.h>
|
13
|
int main( void )
|
14
|
{
|
15
|
int arr[]
= {10, 20};
|
16
|
int *p
= arr;
|
17
|
*p++;
|
18
|
printf ( "arr[0]
= %d, arr[1] = %d, *p = %d" ,
arr[0], arr[1], *p);
|
19
|
return 0;
|
20
|
}
|
21
|
//
PROGRAM 3
|
22
|
#include
<stdio.h>
|
23
|
int main( void )
|
24
|
{
|
25
|
int arr[]
= {10, 20};
|
26
|
int *p
= arr;
|
27
|
*++p;
|
28
|
printf ( "arr[0]
= %d, arr[1] = %d, *p = %d" ,
arr[0], arr[1], *p);
|
29
|
return 0;
|
30
|
}
|
只要记住下面的运算规则就不难预测程序的输出:
1) 前置 ++ 和 * 的优先级是相同,都是从右向左结合
2) 后置++的优先级高于 *和前置++, 后置++从左向右结合
参考:C语言中运算符的优先级
程序1: ++*p 优先级相同且都从右向左结合,可以看做是 ++(*p) ,因此p所指向的那个数改变了。arr[0] = 11, arr[1] = 20, *p = 11
程序2: *p++ 可以看做是 *(p++), 指针的地址是变了,内容没变。arr[0] = 10, arr[1] = 20, *p = 20
程序3:*++p 优先级相同且都从右向左结合,可以看做是 *(++p). arr[0] = 10, arr[1] = 20, *p = 20
原文:http://www.acmerblog.com/interview-pointer-p-5539.html