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
沒有留言:
張貼留言