溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C之 ++ 和 -- 操作符(十六)

發(fā)布時間:2020-07-24 08:18:41 來源:網(wǎng)絡(luò) 閱讀:697 作者:上帝之子521 欄目:編程語言

        我們在 C 語言中會經(jīng)常見到 ++ 和 -- 操作符,筆試題中也經(jīng)常見到。下我們就來分析這兩個操作符。

        ++ 和 -- 操作符對應(yīng)兩條匯編指令,前置時:變量自增(減)1后取變量值;后置時:取變量值后變量自增(減)1。

        下來我們來看個示例代碼,代碼如下:

#include <stdio.h> 

int main()
{
    int i = 0;
    int r = 0;

    r = (i++) + (i++) + (i++);

    printf("i = %d\n", i);
    printf("r = %d\n", r);

    r = (++i) + (++i) + (++i);

    printf("i = %d\n", i);
    printf("r = %d\n", r);

    return 0;
}

        我們分析第8行,i++執(zhí)行3次,r = 0 + 1 + 2 = 3; i = 3; 第 13 行 r = 4 + 5 + 6 = 15; i = 6;我們來看看 gcc 下編譯的結(jié)果是多少

C之 ++ 和 -- 操作符(十六)

         我們看到最后的 r 打印的是 16,跟我們分析的不一樣。那么我就直接告訴大家答案了,這塊需要去反匯編看看代碼是怎么執(zhí)行的。通過查看匯編代碼,我們發(fā)現(xiàn)在 gcc 中,它先是自增兩次然后相加,再次自增一次,再加上6,結(jié)果就是16了。有興趣的同學(xué)可以自己去反匯編,看看代碼是怎樣執(zhí)行的。我們再來看看 BCC 這款編譯器執(zhí)行的結(jié)果是怎樣的

C之 ++ 和 -- 操作符(十六)

         我們發(fā)現(xiàn)最后一個 r  和我們分析的一樣,但是第一個 r 為0,這是怎么回事呢?還是得通過反匯編代碼來看,它是這樣執(zhí)行的,先把 0 拿出了加三次,再次自增 3 次。所以第一個 r 為0,而 i 為3。

         在 C 語言中只規(guī)定了 ++ 和 -- 對應(yīng)指令的相對執(zhí)行次序;++ 和 -- 對應(yīng)的匯編指令不一定連續(xù)執(zhí)行;在混合運(yùn)算中,++ 和 -- 的匯編指令可能會被打斷執(zhí)行,換句話說,++ 和 -- 參與混合運(yùn)算的結(jié)果是不確定的。

        我們會在一些筆試題中遇到這樣一些題目:1、++i+++i+++i;2、a+++b;那么我們在遇到這些題目時該怎樣去解答呢?在 C 語言中它的處理是貪心法,即:a> 編譯器處理的每個符號盡可能多的包含字符;b> 編譯器以從左向右的順序一個一個盡可能多的讀入字符;c> 當(dāng)讀入的字符不可能和已讀入的字符組成合法符號為止。

        我門下來就來分析個示例代碼,代碼如下:

#include <stdio.h>

int main()
{   
    int i = 0;
    int j = ++i+++i+++i;
    
    int a = 1;
    int b = 4;
    int c = a+++b;

    printf("i = %d\n", i);
    printf("j = %d\n", j);
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
      
    return 0;
}

        我們來分析下,第 6 行相當(dāng)于 j = ++i++ ==> 1++,這樣會出錯,因?yàn)?++不是個合法的表達(dá)式。第10行相當(dāng)于 c = a++ + b ==> c = 1 + 4 ==> c = 5;這時 a = 2

        我們編譯的時候第6行出現(xiàn)錯誤

C之 ++ 和 -- 操作符(十六)

        那么我們在下面加上一句 1++,看看打印的錯誤提示是否和上面的一樣呢

C之 ++ 和 -- 操作符(十六)

        大家看到兩句錯誤提示一樣,證明我們的分析是對的,我們屏蔽后再次執(zhí)行

C之 ++ 和 -- 操作符(十六)

        我們看到 a = 2, c = 5 和我們分析的一樣。那么我們在平時的書寫中可以加上空格,空格可以作為 C  語言中的一個完整符號的休止符,編譯器讀入空格后立即對之前讀入的符號進(jìn)行處理。同時加入空格也可以增強(qiáng)程序的可讀性。

        通過本次 ++ 和 -- 操作符的學(xué)習(xí),我們總結(jié)如下:1、++ 和 -- 操作符在混合運(yùn)算中的行為可能不同;2、編譯器通過貪心法處理表達(dá)式中的字表達(dá)式;3、空格可以作為 C 語言中一個完整符號的休止符,編譯器讀入空格后立即對之前讀入的符號進(jìn)行處理。后面我們會繼續(xù)對 C 語言的學(xué)習(xí)。


         歡迎大家一起來學(xué)習(xí) C 語言,可以加我QQ:243343083。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI