程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 一個C筆試題引出一系列的問題

一個C筆試題引出一系列的問題

編輯:關於C

下段代碼的輸出是什麼?(這是我做過的一個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。

就分析到這裡,發現新內容再補充。


摘自 cjok376240497
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved