今天做oj的時候,定義了兩個宏:
//wrong code
#define max_2(a,b) a>b?a:b #define max_3(a,b,c) (a>b?a:b)>c?(a>b?a:b):c
然后程序結果總是WA,仔仔細細檢查程序的邏輯一遍又一遍,都快抓狂了,最后終於發現是我定義的兩個宏有問題。改為如下就AC了:
#define max_2(a,b) (a>b?a:b) #define max_3(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
對的,就是差兩個括號,沒有括號,因為優先級不一樣,造成運算順序並不是我們預期的那樣,運算結果錯誤。
下邊是分析過程:
先上兩段有問題的代碼:
#include <iostream> #define max_2(x,y) x>y?x:y using namespace std; int main() { int a=max_2(1,2)+3; int b=max_2(2,1)+3; int c=max_2(1,2); int d=max_2(2,1); int e=(max_2(2,1)+3); cout<<a<<" "<<b<<endl; cout<<c<<" "<<d<<endl; cout<<e<<endl; return 0; }
運行結果:
從程序中變量c、d可以發現,max_2(x,y)里不論x、y的順序如何,max_2(x,y)能夠返回正確的結果;
從程序中變量a、b可以發現,運算順序跟max_2(x,y)里x、y的順序有關,當x>y時,程序先將max_2(2,1)的結果賦給b,而不是加3之后再賦給b;
從程序中變量e可以發現,即使加了括號,也不能改變這種運算順序。
另一段問題代碼,如下圖,編譯都不能通過:
所以,不要忘了關鍵的括號,不然害人不淺。