Was ist &&& Operation in C

Lesezeit: 3 Minuten

Benutzeravatar von manav mn
manav mn

#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 kompiliert mit gcc ist

0
1
1

Mit dem -Wall oder -Waddress Möglichkeit, gcc gibt eine Warnung aus:

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

Wie ist c im oben genannten Programm evaluiert?

  • Ich glaube, es ist i && (&i)? Interessant, dass ich keinen doppelten Beitrag auf SO finden kann.

    – unerschöpflich

    19. Dezember 2012 um 6:49 Uhr


  • while (i &&& i <-- j) {}.

    – kennytm

    19. Dezember 2012 um 7:57 Uhr

  • mögliches Duplikat von Können Sie in der C-Programmierung ein dreifaches Minuszeichen haben? Was bedeutet das?

    – Anirudh Ramanathan

    19. Dezember 2012 um 10:14 Uhr

  • Kein Duplikat, aber eine ähnliche Frage und das ist ein guter Link

    – Nathan Cooper

    19. Dezember 2012 um 10:43 Uhr

  • @Manav stackoverflow.com/questions/1642028/…

    – Iskata

    19. Dezember 2012 um 11:33 Uhr

Es ist c = i && (&i);wobei der zweite Teil überflüssig ist, da &i wird nie zu bewerten false.

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

Wenn du Warnungen einschaltenerhalten Sie so etwas wie:

Warnung: Die Adresse von ‘i’ wird immer als ‘true’ gewertet

  • Warum nicht : c = i & (&&i);; Wo i ist ein Etikett?

    – Anishane

    20. Dezember 2012 um 9:21 Uhr

  • @anisane i ist definiert als int und es gibt keine Labels in der Frage. Auch maximales Fressen…

    – Luchian Grigore

    20. Dezember 2012 um 9:35 Uhr

  • @anishsane: Und die && Operator, um die Adresse eines Labels zu nehmen, ist sowieso keine Standard-gcc-Erweiterung. Aber selbst wenn es Standard wäre, würde die Maximal-Munch-Regel verhindern, dass es auf diese Weise analysiert wird (es sei denn, Sie fügen ein Leerzeichen ein).

    – Keith Thompson

    27. Dezember 2012 um 20:36 Uhr

  • Eigentlich, &i auswerten kann false. Es wird manchmal für Standardwerte verwendet. Beispiel: void fn(type& x = *reinterpret_cast<type*>(NULL)); Welchen Wert hat &x in fn wenn fn wird ohne Parameter aufgerufen? Es ist 0, auch bekannt als falsch. Wenn Sie es jedoch auf die beschriebene Weise verwenden, ist es immer wahr, es sei denn i == 0und wenn man es so verwenden würde, wie ich es beschrieben habe, wäre es so c = &i && i.

    – Adrian

    24. Mai 2013 um 22:09 Uhr


  • @Adrian Sie können keinen Nullzeiger dereferenzieren, was das ist * Vor reinterpret_cast<type*>(NULL) tut.

    – Luchian Grigore

    24. Mai 2013 um 22:14 Uhr

Benutzeravatar von Keith Thompson
Keith Thompson

Es gibt kein &&& Operator oder Token in C. Aber die && (logisches “und”) und & (unäre Adress-von- oder bitweise “und”)-Operatoren existieren.

Bis zum maximal kauen Regel, das:

c = i &&& i;

ist äquivalent dazu:

c = i && & i;

Es setzt c zu 1 wenn beides i und &i wahr sind, und auf 0, wenn einer von ihnen falsch ist.

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

Es setzt c zu 1 wenn i nicht null ist, oder to 0 wenn i gleich Null ist.

Was impliziert, dass die &&& wird hier nur zur absichtlichen Verschleierung verwendet. Die Aufgabe könnte auch 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++

1425670cookie-checkWas ist &&& Operation in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy