warning: comparison of constant ‘2’ with boolean expression is always false
警告:定数 ‘2’ と真偽値式の比較は常に偽
[-Wbool-compare]
■1.【>】と【>>】の間違い
#include <stdbool.h>
#include <stdint.h>
int f1(uint32_t n) {
//(n > 1)の結果は真偽値(0/1)なので2と等しくない
if ((n > 1) == 2) //★NG
return 1;
return 0;
}
int f2(uint32_t n) {
if ((n >> 1) == 2) //OK
return 1;
return 0;
}
参考:
C-FAQ 9.2: 組み込みのブール値を 返す演算子や関係演算子が1以外の値を”返したら”どうするのか。
http://www.kouno.jp/home/c_faq/c9.html#2
■2.【==】と【=】の間違い
int f3(void) {
int c ;
if((c == getchar()) != EOF) //★NG
return c;
return 0;
}
int f4(void) {
int c;
if((c = getchar()) != EOF) //OK
return c;
return 0;
}
■3.【&&】と【&】の間違い
int f5(uint32_t x) {
//論理演算とビット演算は違う
if ((x && 2) == 2) //★NG
return 1;
return 0;
}
int f6(uint32_t x) {
if ((x & 2) == 2) //OK
return 1;
return 0;
}
■4.if(x<y<z)は間違い
int f7(int x) {
if(0 <= x <= 10)//★NG
return 1;
return 0;
}
int f8(int x) {
if((0 <= x) && (x <= 10)){//OK
return 1;
return 0;
}
if(0 <= x <= 10){に数学的意味はありません。
if(0 <= x <= 10){
↓
if((0 <= x) <= 10){
↓
if((true) <= 10){ or
if((false) <= 10){
↓
if((1) <= 10){ or
if((0) <= 10){
↓
if((0or1) <= 10){ //always true (常に真)