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

++*p*p++*++p的区别

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

只要记住关于后缀++、前缀++和*(dereference)操作符的简单规则,上述程序和所有这类程序的输出都很容易猜到

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.

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程