阅读并预测以下C程序的输出。

程序-1

// 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; 
}

程序-2

// 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; 
}

程序-3

// 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; 
}

记住以下有关后缀++,前缀++*(取消引用)运算符的简单规则,可以轻松猜出上述程序和所有此类程序的输出。

  • 前缀++*的优先级相同,两者的关联性是从右到左。
  • 后缀++的优先级高于*和前缀++。 后缀++的关联性从左到右。

表达式++ * 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

欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:++*p, *p++ 和*++p
本文链接:https://www.vsdiffer.com/vs/++p-vs-p++vs++p.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。