#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, gcc
ist
0
1
1
Gibt mit der Option -Wall
oder eine Warnung aus:-Waddress
gcc
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
Wie wird c
das obige Programm bewertet?
c++
c
operators
compiler-optimization
gcc-warning
manav mn
quelle
quelle
i && (&i)
? Interessant, dass ich auf SO keinen doppelten Beitrag finden kann.while (i &&& i <-- j) {}
.Antworten:
Es ist
c = i && (&i);
, mit dem zweiten Teil überflüssig, da&i
wird nie zu bewertenfalse
.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:
quelle
c = i & (&&i);
; Woi
ist ein Etikett?i
ist definiert alsint
und es gibt keine Beschriftungen in der Frage. Auch maximales Knabbern ...&&
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).&i
kann man auswertenfalse
. Es wird manchmal für Standardeinstellungen verwendet. Beispiel:void fn(type& x = *reinterpret_cast<type*>(NULL));
Was ist der Wert von&x
infn
iffn
, der ohne Parameter aufgerufen wird? Es ist 0 aka falsch.i == 0
Wenn 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 auchc = &i && i
.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 :
ist gleichbedeutend damit:
Es setzt
c
auf 1 , wenn beidei
und&i
wahr 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
c
auf 1 gesetzt, wenni
es nicht Null ist, oder auf0
if , wenni
es gleich Null ist.Was bedeutet, dass das
&&&
hier nur zur absichtlichen Verschleierung verwendet wird. Die Zuordnung kann genauso gut eine der folgenden sein:quelle