C++中運算符優先級的學習注解
2019-11-17 05:26:09
供稿:網友
提起運算符的優先級,很多了解C++的過來人都會想:這有什么難的?不就是誰的優先級高就算誰么。確實如此,運算符的優先級不是一個大問題,但對于一個初學者來說,卻經常輕易在上面迷糊與犯錯。而對于一個了解C++的人來說,我相信也會偶然在上面摔倒,不信就繼續往下讀。
“優先級高的先運算”帶來的困惑
C++中運算符的優先級有一張表,表里把運算符進行了分類,這張表是不需要死記硬背的,只要有個大致的輪廓就OK了。例如應該記住最低優先級是逗號運算符,其次是賦值運算符,再其次是三目運算符。而關系運算符的優先級高于邏輯運算符(不包括邏輯非運算),算術運算符的優先級高于關系運算符,象++和﹣﹣的優先級比前面幾個都高,但最高的要屬()了。知道這些后,你的腦海里一定有一條準則了:優先級高的先運算。那么下面看一個例子:
int x=1,y=0;
!x&&x+y&++y;
上面的語句中出現了!、&& 、+、++這四個運算符,那么問題來了,到底先算誰呢?
有一個姓蔡的同學站起來說,++運算符在這里面優先級最高,理所應當最先算++,既先計算++y,再算!x,再算x+y,最后把它們&&起來。按照蔡同學的思路,第二步的結果是0&&x+y&&1,由于&&是嚴格運算,有一個為0結果既為0,所以不需要計算x+y了,整個語句的結果是:假。按照上面蔡同學的說法,執行完后y的值應該是1了,這對不對呢?
一位姓高的同學站起來反駁道,我覺得應該先計算!x,假如值為假,則不需要計算下去,最后結果為假。假如值為真,再計算x+y,同理假如其值為真,再去計算++y,否則最后結果也為假。
蔡同學不服起來說,高同學你覺得++和!誰的優先級高呢?高同學答道,那當然是++高。蔡同學接著問,那為什么還要先計算!呢?高同學答不出來了。
是呀,為什么要先算呢? 三層交換技術 交換機與路由器密碼恢復 交換機的選購 路由器設置專題 路由故障處理手冊 數字化校園網解決方案 加括號確定優先級的方法
高同學說的是正確的,為什么呢?下面我給大家解釋一下。當多個優先級不同的運算符在一起時,為了不混淆,可以先加上括號,這樣就分出層次了,相同層次的考慮結合性問題,當確定下來先算那塊時,再往這塊里面深入。例如上面的例子,我們可以這樣加上括號:從左向右看,由于!比&&優先級高,所以有(!x),又由于&&比+優先級低,所以有(x+y),而++優先級高于&&,所以(++y)。這樣整個式子就變成了:(!x)&&(x+y)&&(++y),最外層的是兩個&&運算,由于&&的結合性是從左至右,所以上式可看成:A&&B&&C,先計算A,再計算B,最后算C。由于x=1,則!x就為假,后面的就不需要再算了,整個語句的值為假。執行完后,y的值沒變,還是0。
所以碰到不清楚先算誰后算誰時,先加個括號看看,就明白了先后次序。下面做一個加括號的練習:給語句c=a>b?a:b;加括號。此語句有三個運算符:=、>、? :,應該怎樣加括號呢?
第一種方案:c=((a>b)?a:b);
第二種方案:c=(a>(b?a:b));
第三種方案:(c=a)>(b?a:b);
應該是那一種呢?按照運算符優先級的高低順序,>優先級高于=,所以不可能把(c=a)括起來。而>優先級高于? :運算符。所以也不可能把(b?a:b)括起來。因此,第一種答案正確。
下面再看一個類似的例子:
int i=8,j=4,k;
k=i
猛然一看,有些人上來可能就要計算++i和++j了。這里不妨先加括號看看。從左至右看,<的優先級高于=而且又高于? :,所以有k=(i
所以運算符的優先級千萬要小心,既不是想象的那么難,也不是想象的那么輕易。