2012-06-08 14 views
8

[Wydaje się dziwne, to nie istnieje, więc przeprosiny z wyprzedzeniem, jeśli jest to duplikat]Logical równość w C

Chcę przetestować logicznego równości w C. Innymi słowy, chcę wiedzieć, czy dwa wartości byłyby równe, gdyby oba zostały przekonwertowane w normalny sposób związany z wyrażeniami logicznymi.

W C99, myślę, że

(bool)a == (bool)b 

daje to, co chcę. Czy to jest poprawne? Jaki jest normalny sposób pisania tego w tradycyjnym C?

+2

Zwykły tradycyjny C nie ma typu bool. –

+4

err, chłopaki? czytasz q? Wiem, że tradycyjne C nie ma boola. właśnie dlatego pytam, jak byś napisał to w tradycyjnym C. również, Als, '==' zwróci false dla '1 == 2', co nie jest tym, czego chcę. –

Odpowiedz

10

Zazwyczaj zobaczyć:

if ((a == 0) == (b == 0)) 

Albo

if (!!a == !!b) 

Od !!a ma wartość 1, jeśli jest różna od zera, a 0 w przeciwnym razie.

Mam nadzieję, że to pomoże!

1

Nie ma (bool) w tradycyjnym c. Prawda/fałsz jest obsługiwana przy użyciu int s. Możesz sprawdzić równość boolowską za pomocą

a ? b : !b 
+1

jest bool w C99. –

+0

Przez ostatnie 13 lat było "bool" ... –

+0

Miałem na myśli tradycyjne c, nie c99. –

6

W C zero jest fałszywe. Jeśli chcesz przekonwertować dowolną wartość na jej odpowiednik boolowski, standardowy sposób (no, z wyjątkiem tego, że prawie nigdy nie jest potrzebny), to przedrostek wyrażenia z !!, jak w !!a. W przypadku wyrażenia, !!a == !!b można uprościć do !a == !b

+0

kiedy * jest * tam potrzeba? –

+0

Gdy aib mogą mieć różne niezerowe wartości, i chcesz wiedzieć, czy będą one oceniać do tej samej wartości boolowskiej w kolejnym teście z kontrolą przepływu, takim jak 'if()'. –

+0

oh, przepraszam, błędnie przeczytałem twoją oryginalną odpowiedź. –

2

w pre-C99 C, tradiitional, idiomatyczne sposobem "cast do bool" jest z !!.