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

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

算子優先與評價順序

算子優先與評價順序

C++ C
慕萊塢森 2019-07-02 10:57:43
算子優先與評價順序術語“運算符優先”和“評估順序”是編程中非常常用的術語,對于程序員來說非常重要。據我所知,這兩個概念是緊密聯系在一起的;在談論表達時,一個概念離不開另一個概念。讓我們舉一個簡單的例子:int a=1;  // Line 1a = a++ + ++a;  // Line 2printf("%d",a);  // Line 3現在,很明顯Line 2導致未定義的行為,因為C和C+中的序列點包括:在計算&(邏輯和)、歐元(邏輯OR)和逗號運算符的左操作數和右操作數之間。例如,在表達式中*p++ != 0 && *q++ != 0,子表達式的所有副作用*p++ != 0在嘗試訪問之前已完成。q.在計算三元“問號”運算符的第一個操作數和第二個或第三個操作數之間。例如,在表達式中a = (*p++) ? (*p++)  : 0之后有一個序列點。*p++,這意味著在執行第二個實例時,它已經增加了。在一個完整表達式的結尾。此類別包括表達式語句(例如賦值)。a=b;)、返回語句、if、Switch、while或do-while語句的控制表達式以及for語句中的所有三個表達式。在函數調用中輸入函數之前。未指定計算參數的順序,但此順序點意味著在輸入函數之前,它們的所有副作用都已完成。在表達中f(i++) + g(j++) + h(k++), f的原始值的參數調用。i,但是i在進入f..同樣,j和k在輸入前更新g和h分別。但是,它沒有按哪個順序指定。f(), g(), h()被執行,也不按哪個順序執行i, j, k都是遞增的。的價值j和k在…的身體里f因此是沒有定義的。3注意,函數調用f(a,b,c)的逗號運算符和計算順序的使用。a, b,和c沒有具體說明。在函數返回時,將返回值復制到調用上下文中。(這個序列點僅在C+標準中指定;它僅隱式地存在于C中。)在初始化器的末尾;例如,在聲明中計算5之后int a = 5;.因此,通過第3點:在一個完整表達式的結尾。此類別包括表達式語句(例如賦值a=b;)、返回語句、if、Switch、while或do-while語句的控制表達式,以及for語句中的所有三個表達式。Line 2顯然會導致行為不明。這說明了未定義行為緊密耦合序列點.現在讓我們再舉一個例子:int x=10,y=1,z=2; // Line 4int result = x<y<z; // Line 5現在很明顯Line 5將使變量result商店1.現在表達x<y<z在……里面Line 5可將其評價為:x<(y<z)或(x<y)<z..在第一種情況下,result將是0在第二種情況下result將是1..但我們知道,當Operator Precedence是Equal/Same - Associativity因此,被評估為(x<y)<z.這就是我們所說的MSDN條款:C算子的優先級和結合性影響表達式中操作數的分組和求值。只有當其他優先級較高或較低的運算符存在時,運算符的優先級才是有意義的。首先計算具有高優先級運算符的表達式。優先級也可以用“綁定”一詞來描述。具有較高優先級的運算符據說具有更緊密的綁定?,F在,關于上面的文章:它提到“先計算具有較高優先級運算符的表達式”。這聽起來可能不正確。但是,如果我們考慮到這一點的話,我認為這篇文章并沒有說錯什么。()也是運算符。x<y<z同(x<y)<z..我的推理是,如果聯想性不起作用,那么整個表達式的評估就會變得模棱兩可,因為<不是序列點.另外,我發現的另一個鏈接是這樣的算子優先性與結合性:此頁面按優先級(從最高到最低)列出C運算符。它們的結合性指示在表達式中應用優先級相等的操作符的順序。以第二個例子為例int result=x<y<z,我們可以在這里看到這三個表達式,x, y和z因為,表達式的最簡單形式是由單個文字常量或對象組成。因此,表達式的結果x, y, z會在那里r值,即10, 1和2分別。因此,現在我們可以解釋x<y<z如10<1<2.現在,由于我們有兩個表達式要計算,所以不起作用嗎?10<1或1<2既然運算符的優先級是一樣的,它們從左到右被評估。?以最后一個例子作為我的論點:int myval = ( printf("Operator\n"), printf("Precedence\n"), printf("vs\n"),printf("Order of Evaluation\n") );在上面的示例中,由于comma運算符具有相同的優先級,則計算表達式。left-to-right的返回值printf()存儲在myval.在……里面SO/IEC 9899:201X在……下面J.1未指明的行為它提到
查看完整描述

3 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

優先級影響計算順序的唯一方法是創建依賴關系;否則,兩者是正交的。您已經仔細選擇了一些瑣碎的示例,在這些示例中,由優先級創建的依賴關系最終確實完全定義了計算順序,但這通常不是真的。不要忘記,許多表達式有兩種效果:它們產生值,也有副作用。這兩種情況不需要一起發生,所以即使依賴關系強制執行特定的計算順序,這也只是值的求值順序;它對副作用沒有影響。


查看完整回答
反對 回復 2019-07-02
?
哈士奇WWW

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

查看這一點的一個好方法是獲取表達式樹。

如果你有一個表達式,讓我們說x+y*z您可以將其重寫為表達式樹:

應用優先級和關聯規則:

x + ( y * z )

在應用優先級和關聯規則之后,您可以安全地忘記它們。

以樹的形式:

  x+
    y  *
    z

現在這個表達式的葉子是xyz..這意味著你可以評估xyz按您想要的任何順序,這也意味著您可以評估*x任何順序。

既然這些表情沒有副作用,你就不在乎了。但是,如果它們這樣做了,排序可能會更改結果,而且由于排序可以是編譯器決定的任何內容,所以您有一個問題。

現在,序列點給這種混亂帶來了一點秩序。他們有效地把這棵樹切成幾段。

x + y * z, z = 10, x + y * z

優先性和結合性之后

x + ( y * z ) , z = 10, x + ( y * z)

樹:

      x    +
        y      *
        z  , ------------
      z    =
      10     
  , ------------
      x    +
        y      *
        z

樹的頂部將在中間之前進行評估,中間部分在底部之前進行評估。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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