算子優先與評價順序術語“運算符優先”和“評估順序”是編程中非常常用的術語,對于程序員來說非常重要。據我所知,這兩個概念是緊密聯系在一起的;在談論表達時,一個概念離不開另一個概念。讓我們舉一個簡單的例子: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個贊
哈士奇WWW
TA貢獻1799條經驗 獲得超6個贊
x+y*z
x + ( y * z )
x+ y * z
x, yzx, yz*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
- 3 回答
- 0 關注
- 502 瀏覽
添加回答
舉報
0/150
提交
取消
