【C言語】
否定演算子(ビックリマーク!)を使った20行の短いサンプルコード

ビックリマーク!は 論理否定演算子

否定演算子(ビックリマーク)のトリッキーな使い方

#include <stdio.h>

int main(void){
    for(int x = -10 ;x<= 10 ;x++){
        int y = !!x;    //2回ビックリすると必ず0か1になる
        printf("%3d➡%d\n",x,y);
    }
}

タイトル通りで特に落ちはありません。

非ゼロの時⇒!非ゼロは0⇒!0⇒1
ゼロの時 ⇒!ゼロは1⇒!1⇒0


➡実行結果

./a.out
-10➡1
 -9➡1
 -8➡1
 -7➡1
 -6➡1
 -5➡1
 -4➡1
 -3➡1
 -2➡1
 -1➡1
  0➡0
  1➡1
  2➡1
  3➡1
  4➡1
  5➡1
  6➡1
  7➡1
  8➡1
  9➡1
 10➡1

※任意の定数を真偽値(0/1)に変換したい時の小技です。


否定演算子の普通の使い方

#include <stdio.h>
#include <ctype.h>
int main(void){
    char str[] = "a1b2c3d+-/*";
    
    for(char *cp = str ;*cp != '\0';cp++){
        if(isalpha(*cp)){//もし、アルファベットならば
            putchar(*cp);
        }
    }
    putchar('\n');
    
    //否定演算子ビックリマークの使い方
    for(char *cp = str ;*cp != '\0';cp++){
        if(!isalpha(*cp)){//もし、アルファベットでなければ
            putchar(*cp);
        }
    }
    putchar('\n');
}

➡実行結果

./a.out
abcd
123+-/*

■否定演算子でド・モルガンの法則を検証する

#include <stdbool.h>
#include <stdio.h>
//ド・モルガンの法則
void DeMorgan(bool x,bool y)
{
    bool    d11     =  (!x && !y);
    bool    d12     = !( x ||  y);
    puts(d11 == d12 ? "同じ" : "違う");
    
    bool    d21     =  (!x || !y);
    bool    d22     = !( x &&  y); 
    puts(d21 == d22 ? "同じ" : "違う");
}  
int main(void)
{
    DeMorgan(false,false);
    DeMorgan(false,true);
    DeMorgan(true,false);
    DeMorgan(true,true);
}

複雑な条件式をリファクタリング(動作を変えずにコードをわかりやすくする事)する際、
ド・モルガンの法則はよく使用されます。

➡実行結果

./a.out
同じ
同じ
同じ
同じ
同じ
同じ
同じ
同じ