#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
Keith Thompson
Es gibt kein &&& Operator oder Token in C. Aber die && (logisches “und”) und & (unäre Adress-von- oder bitweise “und”)-Operatoren existieren.
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++
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