亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C+中的編譯器和求值的參數順序

C+中的編譯器和求值的參數順序

C++
九州編程 2019-07-02 17:37:38
C+中的編譯器和求值的參數順序好的,我知道標準規定C+實現可以選擇計算函數的參數的順序,但是在實際會影響程序的場景中,是否有任何實現可以“利用”這一點呢?典型例子:int i = 0;foo(i++, i++);注意:我不是在找人告訴我,評估的順序是不能依賴的,我很清楚這一點。我只感興趣的是,是否有任何編譯器確實按照從左到右的順序進行計算,因為我的猜測是,如果他們做了大量編寫不當的代碼,就會崩潰(這是正確的,但他們可能仍會抱怨)。
查看完整描述

3 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

它取決于參數類型、被調用函數的調用約定、結構和編譯器。在x86上,帕斯卡調用約定計算從左到右的參數,而在C調用約定中(_cdecl從右到左。大多數在多個平臺上運行的程序都會考慮調用約定來跳過意外事件。

有一個很好的文章如果你有興趣的話,可以在雷蒙德·陳的博客上。您可能還想看看堆棧和調用GCC手冊一節。

編輯:只要我們分道揚鑣:我的回答不是把這看作一個語言問題,而是一個平臺問題。該語言標準不支持或傾向于其中一種而不是另一種,而將其保留為未指定..注意措辭。它并沒有說這是沒有定義的。在這個意義上不明確意味著一些你不能指望的,不可移植的行為。我手頭沒有C規范/草案,但它應該與我的n 2798草案(C+)相似

抽象機器的某些其他方面和操作在本國際標準中被描述為未指定(例如,函數的參數計算順序)。在可能的情況下,本國際標準定義了一組允許的行為。這些定義了抽象機器的非確定性方面。因此,對于給定程序和給定輸入,抽象機器的實例可以具有多個可能的執行序列。


查看完整回答
反對 回復 2019-07-02
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

我找到了答案C+標準.

第5.2.2.8段:

參數的計算順序未指定。參數表達式計算的所有副作用在輸入函數之前生效。未指定后綴表達式和參數表達式列表的計算順序。

換句話說,它只依賴于編譯器。


查看完整回答
反對 回復 2019-07-02
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

讀這個

這不是你的問題的確切副本,但我的回答(和其他幾個)也涵蓋了你的問題。

有很好的優化理由,為什么編譯器可能不只是選擇從右到左,但也交織它們。

標準甚至不能保證順序排序。它確保在調用該函數時,所有參數都已完全評估。

是的,我見過一些版本的GCC就是這樣做的。對于您的示例,foo(0,0)將被調用,之后我將被調用2。(我不能給出編譯器的確切版本號。那是一段時間以前的事了-但我不會驚訝地看到這種行為再次出現。這是安排指令的有效方法)


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 476 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號