首先,先來看一下三者的定義。
優先順序,就是運算的先後順序,例如我們小學學的先算乘除,後算加減。在c++中也是一樣,先*,/,後+,-;
來看下面的c語言**:
// an highlighted block
cout <<1+
2*3<< endl;
根據先算乘法後算加法的優先順序,輸出的結果為7;
結合性,在優先順序相同的條件下,是從左到右(左結合)還是從右到左(右結合)計算。
**片:
// an highlighted block
cout <<2-
1-1<< endl;
從左到右計算,輸出的結果為0,而不是從右到左得到的2;
求值次序,這個是重點,它是指在乙個表示式中優先計算的操作物件(例如:在兩個操作物件的表示式(a=b+c)中,是先計算b呢,還是先計算c呢?)
注意:b,c為操作物件,既可為表示式也可為某個物件;
乍一看上去,有的小夥伴可能會想:
首先,根據優先順序,先計算b或c。
其次,根據結合性,加法為左結合,將b和c相加。
最後,順其自然得到了a的值;
於是,問題產生了,先算b和先算c有什麼區別,彷彿對結果都沒什麼影響呀!
就好比a=(1+2)+(3+4)(其中,b為(1+2),c為(3+4));
無論我們先算(1+2)還是(3+4)結果都是一樣的。
那麼求值次序到底有什麼用?
但是,我們忽略了乙個問題:我們舉的例子都是具體的數字,而**中往往都是物件(例如內建型別物件,int a,double b等)
這時,我們再來看乙個例子:
// an highlighted block
int a =
1, b =
2, c =
3, d =4;
int b
= a + b;
int c
= c + d;
int a=b
+c; cout <<
"a的值為:"
<<
a<< endl;
emmm…好像,也沒有影響。
那我們再來看乙個例子:
// an highlighted block
int i =
0, j;
j = i *
2+ i++
; cout <<
"j的值為:"
<< j << endl;
在這個例子中,如果我們先算i*2,再算i++,結果是0;
而如果先算i++,再算i*2,結果為2;
產生了不同的結果,於是到底是先算左操作物件(i * 2)還是先算右操作物件(i++)呢?
這就是求值次序的作用嗎???(實則不然)
其實,i++要等到分號結束(即語句結束在執行全部***)後再進行++操作,所以,在j的賦值表示式中,i的值一直為0; 並未進行變化。
於是,無論先算左右操作物件,結果都會是0,而不會是2;
所以上面的那個例子是依舊錯誤的(他應該是乙個***和序列點的好例子)
我還測試了以下**:
// an highlighted block
#include
using namespace std;
int f1
(int a)
int&
f2(int& a)
int main()
以上**vs2019輸出的值為1;說明先計算的f1後計算的f2;否則,若先f2後f1,輸出值會是3;
以上我認為才是乙個求值次序的例子。
不難發現,求值次序只在兩個操作物件中有相同的物件,而發生相互影響,才發揮作用(在最後乙個例子中,我們的左右操作物件中都有i這個物件)
至此求值次序的作用也就說清楚了。
下面列舉一下,c99中還規定了四個求值次序:
// an highlighted block
||//與,先左後右
&&//或,先左後右?:
//三目運算子,先左後右
,//逗號運算子,從左到右
c99標準中只規定了這四種求值次序(c++11中也未改變)。而上面的最後乙個例子的結果到底是0還是2,則要根據編譯器而定。在vs2019中j的值為0。
大家的贊,是對我最大的支援,謝謝。
運算的優先順序與結合性
運算子型別 優先順序運算子 運算物件的個數 結合性 基本 1 自左至右單目 2 type sizeof 1 單目運算子 自右至左算術 3 2 雙目運算子 自左至右 4 移位 5 2 雙目運算子 自左至右關係 6 2 雙目運算子 自左至右 7 位邏輯8 2 雙目運算子 自左至右 9 10 邏輯 11 ...
運算子的優先順序和結合 性
優先順序 運算子 含義 運算子型別 結合方向 15 圓括號 單目 自左向右 下標運算子 指向結構體成員運算子 結構體成員運算子 14 邏輯非運算子 自右向左 按位取反運算子 自增運算子 自減運算子 負號運算子 型別 型別轉換運算子 指標運算子 位址運算子 sizeof 長度運算子 13 乘法運算子 ...
運算子的優先順序和結合性
在標準c語言的文件裡,對操作符的結合性並沒有做出非常清楚的解釋。乙個滿分的回答是 它是仲裁者,在幾個操作符具有相同的優先順序時決定先執行哪乙個。每個操作符擁有某一級別的優先順序,同時也擁有左結合性或右結合性。優先順序決定乙個不含括號的表示式中運算元之間的 緊密 程度。例如,在表示式a b c中,乘法...