2012年1月10日 星期二

warning: suggest parentheses around '&&' within '||'

bool isLeap(int year){
    if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
        return true;
    else
        return false;
}
以上程式碼如果用g++ -Wall來編譯的話會在if判斷式那行產生下列的warning
warning: suggest parentheses around ‘&&’ within ‘||’
看到這個warning可能會想說是沒有括上括號,我們整理一下上面的判斷式
if (((year % 100) != 0) || ((year % 400) == 0) && ((year % 4) == 0))
奇怪,怎麼改成這樣還會有warning?
原來原因是發生在&&和||混合使用,但是沒有加上括號表示其運算的先後順序
由上表可以知道&&的運算優先順序是比||來的高
閏年的判斷式compiler其實是後面的((year % 400) == 0) && ((year % 4) == 0)會先算
而不是(year % 100) != 0) || ((year % 400) == 0)先算,從左到右計算
雖然結果一樣,但是運算的先後順序不一樣
最好的方法當然是加上括號,這樣就不會造成誤會了
在此例,正確的邏輯應該要改成這樣
if (((year % 100) != 0) || (((year % 400) == 0) && ((year % 4) == 0)))
統一把&&或是||加上括號就不會產生warning

沒有留言:

張貼留言