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
  所以運算符的優先級千萬要小心,既不是想象的那么難,也不是想象的那么輕易。