Cos'è l'operazione &&& in C


195
#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;
}

L'output del programma sopra compilato usando gccè

0
1
1

Con l' opzione -Wallo -Waddress, gccemette un avviso:

warning: the address of i will always evaluate as true [-Waddress]

Come viene cvalutato nel programma sopra?


42
Lo credo i && (&i)? Interessante che non riesca a trovare un post duplicato su SO.
irrelephant

42
while (i &&& i <-- j) {}.
kennytm,


8
Non è un duplicato, ma è una domanda simile ed è un buon collegamento
Nathan Cooper,

Risposte:


272

È c = i && (&i);, con la seconda parte ridondante, dal momento &iche non valuterà mai false.

Per un tipo definito dall'utente, dove puoi effettivamente sovraccaricare unario operator &, potrebbe essere diverso, ma è comunque una pessima idea .

Se attivi gli avvisi , otterrai qualcosa del tipo:

attenzione: l'indirizzo di 'i' verrà sempre valutato come 'vero'


1
Perché no c = i & (&&i);:; Dov'è iqualche etichetta?
anishsane,

4
@anishsane iè definito come inte non ci sono etichette nella domanda. Inoltre, munch massimo ...
Luchian Grigore il

5
@anishsane: E l' &&operatore a prendere l'indirizzo di un'etichetta è comunque un'estensione gcc non standard. Ma anche se fosse standard, la regola del munch massimo impedirebbe che venga analizzata in quel modo (a meno che non si inserisca uno spazio).
Keith Thompson,

In realtà, &ipuò valutare false. Viene usato a volte per impostazione predefinita. Esempio: void fn(type& x = *reinterpret_cast<type*>(NULL)); qual è il valore di &xin fnse fnviene chiamato senza parametri? È 0 aka falso. Tuttavia, usandolo nel modo descritto, sarà sempre vero a meno che i == 0, e se uno lo stesse usando come ho descritto, lo sarebbe c = &i && i.
Adrian,

@LuchianGrigore: come mai?
Adrian,

118

Non esiste alcun &&&operatore o token in C. Ma esistono gli operatori &&(logico "e") e &(indirizzo unario o bit a bit "e").

Secondo la regola del munch massimo , questo:

c = i &&& i;

è equivalente a questo:

c = i && & i;

Imposta csu 1 se entrambi ie &isono veri e su 0 se uno di essi è falso.

Per un int, qualsiasi valore diverso da zero è vero. Per un puntatore, qualsiasi valore non nullo è vero (e l'indirizzo di un oggetto è sempre non nullo). Così:

Imposta csu 1 se iè diverso da zero o su 0se iè uguale a zero.

Ciò implica che &&&qui viene utilizzato solo per offuscamento deliberato. Il compito potrebbe anche essere uno dei seguenti:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.