2014-12-03 110 views
2
int main() 
{ 
    char arr[] = "geeksforgeeks"; 
    char *ptr = arr; 

    while(*ptr != '\0') 
     ++*ptr++; 
    printf("%s %s", arr, ptr); 

    getchar(); 
    return 0; 
} 

while循環++ptr++中的語句的行爲方式我不明白。後增量應該首先被評估,因爲它的優先級高,並且第一個輸出值應該是f(遞增e)。但是這並沒有發生。爲了理解我將聲明更改爲++*(ptr++),所以它可能會給出我期望的輸出(ffltgpshfflt是我期望的輸出;但實際輸出hffltgpshfflt)。但是輸出不會改變。 ()運算符的優先級高於預增加的優先級。但爲什麼產量不變呢?c中的前綴和後綴的優先級和關聯性

回答

1

我們:

++*ptr++ 

首先,正如你所說的後綴運算應用。然而,根據後綴增量運算符的定義,ptr++評估爲ptr並增加ptr1。表達式不會評估增加的值,而是評估原始值。

所以*(ptr++)計算結果爲相同的值*ptr,前者也只是增加ptr。因此,數組中的第一個元素在算法的第一遍中被修改。

括號不重要,因爲後綴增量已經具有優先權。

如果用替換此:

++*++ptr 

gffltgpshfflt 

,其中運營商的執行順序是一樣的;不同之處在於前綴++的工作方式與後綴++不同 - 它的計算結果爲增加的值。請注意,由於ptr在檢查與0的相等性之前被修改,所以這也會使空終止符變混淆。

+0

謝謝。但是在表達式++ * ++ ptr中,首先會發生++ ptr。 ptr移動到下一個位置,並且當推定值是'e'時,預先遞增我們得到'f'。這繼續,最後null值也被改變。但是輸出gffltgpshfflt怎麼樣? – 2014-12-04 10:50:02

+0

如果您指的是最初的'g'來自哪裏,它仍然是原始字符串。它沒有被修改,因爲'++ ptr'跳過了第一個字符。 'arr'仍然指向這個'g',因爲'arr'(指針)沒有改變。 – svinja 2014-12-04 13:25:57