• <tt id="lutwa"></tt>

    <b id="lutwa"></b>

  • <u id="lutwa"><small id="lutwa"></small></u>
    <b id="lutwa"><small id="lutwa"></small></b>
    
    
    <u id="lutwa"><small id="lutwa"></small></u>
  • <u id="lutwa"><small id="lutwa"></small></u>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    a[i] = i++ 到底對不對?

    • 發布:C++培訓
    • 來源:問答庫
    • 時間:2020-11-18 15:30

    編程中有時會遇到一些有歧義的表達式,比如 a[i] = i++ 。那么 a[i] = i++ 到底對不對呢?

    首先請看如下代碼:

    #include<stdio.h>

    int main(){

    int i=0;

    int a[3] = {1,2,3};

    a[i] = i++;

    printf("%d \n",a[i]);

    printf("%d %d %d ",a[0],a[1],a[2]);

    return 0;

    }

    對于這個表達式中 a[i] = i++,子表達式i++有一個副作用,它會改變i的值,由于i在同一表達式中會被引用,因此這樣會導致未定義的行為。因為無法判定該引用(該公式中的左邊的a[i]中)是新值還是舊值。

    不同的編譯器在解釋此類行為的時候會有不同的理解,比如下面三個編譯器(dev c++ 、 codeblocks、vs2019 )對于上述的代碼就有不同的理解。

    對于此類行為,盡管有些文獻中認為這類表達式的行為是不確定的,但是c標準卻強烈聲明它是未定義的。

    未定義行為的其他示例包括訪問超出其邊界的數組, 解除引用空指針, 在生命終結后訪問對象 或寫作 據稱聰明的表達 喜歡 i++ + ++i。

    未定義的行為還有兩個不那么危險的兄弟, 不確定的行為 和 實現定義的行為。

    那么實現定義的行為、不確定的行為、未定義的行為這三者的區別在哪里呢?

    首先這三種情況都代表了c語言標準中沒有明確要求某個特定構造或使用它的程序必須完成的事情的領域。c語言定義中的這種松散性是傳統的,但是這種規定方式是經過深思熟慮的,這種定義方式允許作者:

    1 選擇某些構造可以按照“硬件完成的方式”生成高效的代碼。

    2 忽略某些太難準確定義、并且可能在良好書寫的程序中沒什么實際用處的邊界構造。

    對于這3種“標準中沒有準確定義的行為“的定義如下:

    1 實現定義的行為

    抽象機的某些方面和操作在本國際標準中描述為 實現定義 (例如, sizeof(int))。這些構成了抽象機器的參數。每個實施應包括描述其在這些方面的特征和行為的文件。

    2 不確定的行為

    抽象機的某些其他方面和操作在本國際標準中描述為 不明 (例如,評估函數參數的順序)。在可能的情況下,C語言國際標準定義了一組允許的行為。這些定義了抽象機器的非確定性方面。

    3 未定義的行為

    任何事情都有可能發生,標準對此沒有任何要求,程序可能編譯失敗、運行錯誤(直接崩潰或者生成錯誤的結果)或者幸運的如程序員所愿。

    既然標準對編譯器沒有進行任何要求,那么編譯器就可以做出任何可能的行為。在程序中忍受未定義的想法是極其危險的,未定義行為比你想象的還要未定義。

    如果大家想書寫可移植代碼,那么上述的三種行為都是需要極力避免的。因此我們在編寫代碼時最好避免 a[i] = i++ 這種C語言未定義的寫法。

    版權聲明:轉載文章來自公開網絡,版權歸作者本人所有,推送文章除非無法確認,我們都會注明作者和來源。如果出處有誤或侵犯到原作者權益,請與我們聯系刪除或授權事宜。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:C/C++中的必須熟記的基礎知識
    下一篇:空指針到底是什么意思?

    a[i] = i++ 到底對不對?

    C++培訓哪家好?全方位對比機構

    C/C++中的必須熟記的基礎知識

    C語言為什么沒有數組下標越界檢查?

    • 關注微信公眾號

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美牲交av欧美牲交aⅴ暴力,俄罗斯freeⅹ性欧美,日本加勒比无码中文字幕,放荡的女教师中文字幕