【C言語】
論理演算子と関係演算子の結果は【0/1】以外にならない

ゼロは偽で 非ゼロは真だが 非ゼロが1とは限らない

warning: comparison of constant ‘2’ with boolean expression is always false

警告:定数 ‘2’ とboolean式の比較は常に偽
[-Wbool-compare]


■【>】と【>>】の間違い

#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

■【==】と【=】の間違い 

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;
}

■【&&】と【&】の間違い

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;
}

■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 (常に真)