首页 > 专题系列 > C基础练习 > 面试题:++*p, *p++ 和 *++p
2014
04-04

面试题:++*p, *p++ 和 *++p

预测下面程序的输出:

// 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) 后置++的优先级高于 *和前置++, 后置++从左向右结合

参考: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


  1. #include <stdio.h>
    int main(void)
    {
    int arr[] = {10,20,30,40,50,60};
    int *p=arr;
    printf("%d,%d,",*p++,*++p);
    printf("%d,%d,%d",*p,*p++,*++p);
    return 0;
    }

    为什么是 20,20,50,40,50. 我觉得的应该是 20,20,40,40,50 . 谁能解释下?