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?

Author: OrangeDog, 2012-12-19

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"

 268
Author: Luchian Grigore,
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++
 116
Author: Keith Thompson,
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