今天做oj的時候,定義了兩個宏:
#define max_2(a,b) a>b?a:b max_3(a,b,c) (a>b?a:b)>c?(a>b?a:b):c
然後程序結果總是WA,仔仔細細檢查程序的邏輯一遍又一遍,都快抓狂了,最後終於發現是我定義的兩個宏有問題。改為如下就AC了:
max_2(a,b) (a>b?a:b) max_3(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
下邊是分析過程:
先上兩段有問題的代碼:
#include <iostream> max_2(x,y) x>y?x:y a=max_2(,)+ b=max_2(,)+ c=max_2(, d=max_2(, e=(max_2(,)+<<a<< <<b<<<<c<< <<d<<<<e<<
運行結果:
從程序中變量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可以發現,即使加了括號,也不能改變這種運算順序。
另一段問題代碼,如下圖,編譯都不能通過:
所以,不要忘了關鍵的括號,不然害人不淺。