第四章 [ ]運算子的本質

來源:互聯網
上載者:User

        數組是存在於人們頭腦中的一個邏輯概念,而編譯器其實並不知道有數組這個東西,它所知道的,只是[]運算子,當遇到[]運算子的時候,編譯器只是簡單地把它轉換為類似*(*(a+i)+j)這樣的等價運算式,之所以是這種運算式,如前幾章所述,是因為C語言的數組實現本質上是數組的嵌套。

        由於這種等價關係的存在,會產生一些古零精怪的運算式,例如:

10[a]

這個運算式初看上去讓人摸不著頭腦,它是什麼呢?如上所述,編譯器會把它轉換為*(10+a),把a和10調換一下,就是*(a+10)了,這個就是a[10]。

[]運算子之前還可以是一個運算式,例如:(10+20)[a]。

嚴格來講,以上兩個運算式是非法的,因為C89對於數組的引用(注意不是數組定義)規定:帶下標的數組引用尾碼運算式由一個尾碼運算式後跟一個括在方括弧中的運算式組成。方括弧前的尾碼運算式的類型必須為“指向T類型的指標”,其中T為某種類型;方括弧中運算式的類型必須為整型。這個規定說明,進行數組引用的時候,[]運算子的左邊並非必須為數組名,而可以是一個運算式,但這個運算式的類型必須為“指向某類型的指標”。顯然10跟(10+20)連地址都不是,因此實際上他們是非法的,編譯器在這裡並沒有嚴格遵守標準的規定。但如果是:

int a[10], *p = a;

(p+1)[2]這樣就是合法的,因為p+1的結果仍然是一個指標。

要注意的是,雖然尾碼運算式是一個“指向某類型的指標”,但不要被這裡所說的指標一詞搞混了,上面的規定不能反過來使用。還是以上面的例子為例,我們可以p[i]這樣使用p,這是符合上述規定的,但並不能因為指標p能夠以p[i]這種形式使用就認為p是一個數組,這就錯誤了,不能反過來應用上述規則。

        最後說一下編譯器對&*的最佳化,對於數組int a[10],如果對其中一個元素取地址,例如&a[1],這條運算式等價於&*(a+1),編譯器並不會先計算*再運算&,而是對&*兩個運算子進行最佳化,把它們同時去掉,因為兩者的作用是相反的,最後得到計算的是a+1運算式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.