Was ist &&& Betrieb 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;
}

Die Ausgabe des obigen Programms, das mit kompiliert wurde, gccist

0
1
1

Gibt mit der Option -Walloder eine Warnung aus:-Waddressgcc

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

Wie wird cdas obige Programm bewertet?

manav mn
quelle
42
Ich glaube es ist i && (&i)? Interessant, dass ich auf SO keinen doppelten Beitrag finden kann.
Irrelephant
42
while (i &&& i <-- j) {}.
Kennytm
8
Kein Duplikat, aber eine ähnliche Frage und das ist ein guter Link
Nathan Cooper

Antworten:

272

Es ist c = i && (&i);, mit dem zweiten Teil überflüssig, da &iwird nie zu bewerten false.

Für einen benutzerdefinierten Typ, bei dem Sie tatsächlich unär überladen können operator &, mag dies anders sein, aber es ist immer noch eine sehr schlechte Idee .

Wenn Sie Warnungen aktivieren , erhalten Sie Folgendes:

Warnung: Die Adresse von 'i' wird immer als 'wahr' bewertet.

Luchian Grigore
quelle
1
Warum nicht : c = i & (&&i);; Wo iist ein Etikett?
Anishsane
4
@anishsane iist definiert als intund es gibt keine Beschriftungen in der Frage. Auch maximales Knabbern ...
Luchian Grigore
5
@anishsane: Und der &&Operator, der die Adresse eines Etiketts übernimmt, ist sowieso keine Standard-gcc-Erweiterung. Aber selbst wenn es Standard wäre, würde die maximale Munch-Regel verhindern, dass es auf diese Weise analysiert wird (es sei denn, Sie fügen ein Leerzeichen ein).
Keith Thompson
Eigentlich &ikann man auswerten false. Es wird manchmal für Standardeinstellungen verwendet. Beispiel: void fn(type& x = *reinterpret_cast<type*>(NULL)); Was ist der Wert von &xin fnif fn, der ohne Parameter aufgerufen wird? Es ist 0 aka falsch. i == 0Wenn Sie es jedoch so verwenden, wie es beschrieben wurde, ist es immer wahr, es sei denn , und wenn man es wie beschrieben verwendet, ist es das auch c = &i && i.
Adrian
@LuchianGrigore: wie so?
Adrian
118

Es gibt keinen &&&Operator oder Token in C. Aber die Operatoren &&(logisches "und") und &(unäre Adresse oder bitweise "und") existieren.

Nach der Maximal-Munch- Regel gilt Folgendes :

c = i &&& i;

ist gleichbedeutend damit:

c = i && & i;

Es setzt cauf 1 , wenn beide iund &iwahr ist, und auf 0 , wenn einer von ihnen falsch ist .

Für ein int ist jeder Wert ungleich Null wahr. Für einen Zeiger ist jeder Wert ungleich Null wahr (und die Adresse eines Objekts ist immer ungleich Null). So:

Es wird cauf 1 gesetzt, wenn ies nicht Null ist, oder auf 0if , wenn ies gleich Null ist.

Was bedeutet, dass das &&&hier nur zur absichtlichen Verschleierung verwendet wird. Die Zuordnung kann genauso gut eine der folgenden sein:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
Keith Thompson
quelle