小心!#define max(a,b) a>b?a:b


今天做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可以發現,即使加了括號,也不能改變這種運算順序。

 

另一段問題代碼,如下圖,編譯都不能通過:

 

所以,不要忘了關鍵的括號,不然害人不淺。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM