2016-11-11 82 views
0
#include<stdio.h> 
int main() 
{ 
    int a[2]={10,4}; 
    int *k; 
    int *j; 
    j=a; 
    k=j; 
    printf("j=%d,k=%d\n\n",*j,*k); 
    *j++; 
    ++*k; 
    printf("j=%d,k=%d",*j,*k); 
    return 0; 
} 

的輸出是:表達式*的p ++和++ * P是如何工作的不同

J = 10,K = 10 J = 4,K = 11

我認爲它應該有相同的結果,但事實並非如此。 我想問一下造成這種差異的原因。我沒有得到它背後的原因。

回答

0

你有兩個東西會在這裏:

  • 前綴和後綴++之間的不同語義;

  • 前綴和後綴運算符的不同優先級。

Postfix的運營商有超過一元(前綴)運算符的優先級高,所以表達式*p++被解析爲*(p++) - 你申請的*運營商的p++結果。相反,前綴++運算符和一元運算符*具有相同的優先級,因此表達式++*p被解析爲++(*p) - 您正將++運算符應用於*p的結果。

還要記住,前綴和後綴++有一些不同的行爲。既增加它們的操作數作爲副作用,但結果後綴++是操作數的當前值,而前綴++的結果是操作數的值加1

4

您需要挖掘您的運營商優先級表。

*p++被評價爲*(p++)

++*p作爲++(*p)

第二個是被評估由於具有相同的優先級指針引用*所以關聯(這是由右至左前綴++對於這些運營商)發揮作用。

爲了完整起見,*(p++)將當前值p取消引用,並且在語句完成後增加1。 ++(*p)p指向的數據加1。

+0

一元和後綴運算符的關聯性是不言而喻的,而且幾乎無關緊要。 '*** p'不可能像'(((*)*)*)p'那樣從左到右關聯,因爲這沒有意義。同樣,'a [i] [j](z)'不能是'a([i]([j]((z))))''。如果你爲這些編寫了一個Yacc解析器,你不需要'%assoc'聲明:這種模糊性根本就不存在。在C中,我們只需要記住一元運算符的優先級低於後綴,所以'op op op expr op op op'表示'op op op(expr op op op)'。 – Kaz