■否定演算子(ビックリマーク)のトリッキーな使い方
#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');
}
➡実行結果
■否定演算子でド・モルガンの法則を検証する
#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
同じ
同じ
同じ
同じ
同じ
同じ
同じ
同じ