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.