2010-11-08 4 views
12

seltsame Frage, aber jemand hat mir gezeigt, das, ich mich gefragt, können Sie mit den nicht! Operator für Int in C++? (Es ist mir fremd).kein Operator in C++ für int?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a=5, b=4, c=4, d; 
    d = !(a > b && b <= c) || a > c && !b; 
    cout << d; 
    system ("pause"); 
    return 0; 
} 
+2

Dies ist kryptischer Code, nicht leicht zu lesen, mit sinnlosen Namen für Variablen. 'd =! (a> b && b <= c) || a > c && !b;' Bitte, sauber programmieren: Wählen Sie gute Namen, und multiplizieren Sie nicht mehrere Operationen in einer Zeile. –

+9

@Stephane: "Jemand hat mir das gezeigt." Wenn der Fragesteller nicht den Code schreiben, wie sie Ihre Anweisungen auszuführen? wie es passiert, nur die '! b' auf die Frage relevant ist, so dass der Rest fallen gelassen werden könnte, aber da der Fragesteller die' versteht nicht! 'Betreiber, könnte dies nicht offensichtlich sein –

+0

@Steve.Okay, aber ich bin so oft auf diese Variablennamen gestoßen ... –

Antwort

23

Ja. Für ganzzahlige Typen, ! gibt true, wenn der Operand gleich Null ist, und false anders.

Also !b hier bedeutet nur b == 0.


Dies ist ein besonderer Fall, in dem ein Wert in ein bool umgewandelt wird. Die !b kann als !((bool)b) betrachtet werden, so ist die Frage, was die „truthness“ von b ist. In C++, arithmetisch Typen, Zeigertypen und ENUM können bool umgewandelt werden. Wenn der Wert 0 oder null ist, ist das Ergebnis false, sonst ist es true (C++ §4.1.2).

Natürlich benutzerdefinierten Klassen können sogar überlasten die operator! oder operator < Typen umwandeln können in bool> die !b für ihre Klassen zu ermöglichen. Zum Beispiel hat std::stream die operator! und operator void* zur Überprüfung der failbit überlastet, so dass Idiome wie

while (std::cin >> x) { // <-- conversion to bool needed here 
    ... 

verwendet werden.

(Aber Ihr Code !(a > b && b <= c) || a > c && !b ist nur kryptisch.)

3

Der Test für int gilt für Nicht-Null-Werte und falsch für Null-Werte, so ist nicht nur wahr für Null-Werte und falsch für Nicht-Null-Werte .

4

Sie können, !b entspricht (b == 0).

3

Der integrierte Operator ! konvertiert sein Argument in bool. Der Standard legt fest, dass eine Umwandlung von jedem arithmetischen Typ existiert (int, char, .... float, double ...) in bool. Wenn der Quellwert 0 ist, ist das Ergebnis true, sonst ist es false

5

Ursprünglich in C (auf denen C++ basiert) gab es keinen booleschen Typ. Stattdessen wurde der Wert "true" einem beliebigen Wert ungleich Null zugewiesen und der Wert "false" wurde einem Wert zugewiesen, der null ergibt. Dieses Verhalten ist weiterhin in C++ vorhanden. Für eine int x bedeutet der Ausdruck !x "x nicht wahr", was "x nicht ungleich Null" ist, d.h. es ist wahr, wenn x Null ist.

+0

großartig! Danke vielmals! – 001