下段代碼的輸出是什麼?(這是我做過的一個C筆試題目,當時213了,沒有給出完全正確的答案,現在來分析總結一下,防止下次再出現這種213的錯誤)
int main(void)
{
int a[] = {6, 7, 8, 9, 10};
int *p = a;
*(p++) += 123; /* 其實沒必要把p++擴起來,*和++在同一優先級,從右到左的結合順序 */
printf("%d, %d\n", *p, *(++p));
return 0;
}
輸出是:8,8
來解釋一下為什麼是這個結果,主要注意兩個地方:
1、*(p++) += 123;在這個題目裡,這行代碼其實是忽悠你的,簡化就是p++;
2、第二點就需要注意函數參數的傳遞,函數參數傳遞是通過棧來實現(大部分是通過棧,還有些是通過寄存器),棧的操作方式是FILO,傳遞參數的時候是第一個參數先入棧,然後再是第二個,第三個,在出棧的時候則相反。所以為什麼第一個輸出是8,應該不難理解了。
雖然像printf("%d, %d\n", *p, *(++p));這樣的代碼,平常是會被鄙視的,不提倡這樣的代碼風格和寫法,但是作為筆試題還是挺考驗基本功的。
到這裡這個題目算是做完了,但是我來深入分析一下:
1、*(p++) += 123;這行代碼產生了什麼樣的影響?
a[0] 的值變為129;
p指針向後移動一個單位。
對於p++這樣的運算,不會對本條語句中產生影響,只會對下一條語句產生作用。
2、 a += b 是否和a = a+b等效?
大部分情況下是等效的,但是也有特例。就是我們下面的情況:
*(p++) += 123;
不等效於
*(p++) = *(p++) + 123;
如果講第一行代碼替換為第二行,輸出結果為 9,9。
就分析到這裡,發現新內容再補充。