Co to jest & & & operacja w C
#include <stdio.h>
volatile int i;
int main()
{
int c;
for (i = 0; i < 3; i++)
{
c = i &&& i;
printf("%d\n", c);
}
return 0;
}
Wyjście powyższego programu skompilowanego przy użyciu gcc
to
0
1
1
Z opcją -Wall
lub -Waddress
, gcc
wyświetla ostrzeżenie:
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
Jak oceniany jest c
w powyższym programie?
2 answers
Jest c = i && (&i);
, a druga część jest zbędna, ponieważ &i
nigdy nie będzie oceniana do false
.
Dla typu zdefiniowanego przez użytkownika, gdzie można przeciążać uniary operator &
, może być inaczej, ale to nadal bardzo zły pomysł .
Jeśli włączysz Ostrzeżenia , otrzymasz coś w stylu:
Ostrzeżenie: adres " i "zawsze będzie oceniany jako "true"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 06:51:26
W C nie ma operatora ani tokena &&&
, ale istnieją operatory &&
(logiczne "i") I &
(jednoargumentowe lub bitowe "i").
Według Zasady maximal munch , to:
c = i &&& i;
Jest równoważne temu:
c = i && & i;
Ustawia c
na 1, jeśli obie i
i &i
są prawdziwe, i na 0, jeśli któreś z nich jest fałszywe.
Dla int, każda niezerowa wartość jest prawdziwa. Dla wskaźnika każda wartość inna niż null jest true (A adres obiektu jest zawsze non-null). Więc:
Ustawia c
na 1, Jeśli i
jest niezerowe, lub na 0
, Jeśli i
jest równe zero.
Co oznacza, że &&&
jest tu używane tylko do celowego zaciemniania. Zadanie równie dobrze może być dowolne z poniższych:
c = i && 1;
c = !!i;
c = (bool)i; // C++ or C with <stdbool.h>
c = i ? 1 : 0; /* C */
c = i ? true : false; // C++
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 20:52:37