2013-02-05 53 views

回答

6

它依賴於編譯器,但可觀察行爲必須是沒有任何反應。在實踐中,我確信大多數編譯器都不會爲空表達式忽略任何代碼。

執行格式良好的程序的一致性實現應產生與具有相同程序和相同輸入的抽象機器的相應實例的可能執行之一相同的可觀察行爲。

而且可觀察到的行爲被定義爲:

的至少要求在一致的實現是:

  • 訪問易失性的對象進行評估嚴格按照抽象機的規則。
  • 在程序終止,寫入到文件中的所有數據將是相同的,以根據所述抽象語義,該程序的執行將產生的可能結果中的一個。
  • 交互式設備的輸入和輸出動力應發生在這樣一個方式是促使輸出程序等待輸入前實際交付。什麼構成交互設備是由實現定義的。

這些統稱爲程序的可觀察行爲

這確實是一個實施的唯一要求。它通常被稱爲「as-if」規則 - 只要可觀察行爲符合預期,編譯器就可以做任何事情。

對於它的價值,這些空表達式被稱爲空語句

與表達缺失被稱爲空語句表達式語句。

如果你真的想要一個NOP,你可以嘗試:

asm("nop"); 

這一點,然而,有條件地支持其行爲是實現定義。

+0

很棒的回答。我的問題的根源在於解決了海灣合作委員會在開啓pedantic時產生的錯誤。特別是,「錯誤,額外」,「這讓我想知道編譯器在做什麼」額外的事情「。 – LeviX

1

,或者如果它是依賴於編譯器。

這是編譯器的依賴(「AS-if規則」),但最合理的優化編譯器會忽略效率的緣故空語句,他們一般不會發出NOP指令。