2010-11-23 20 views
10

In C wird mindestens jeder positive Wert außer 0 als boolescher Wert behandelt. Aber was ist mit einem negativen Wert? Ich habe einige Tests gemacht und es scheint, dass auch negative Werte als boolesche Wahrheiten behandelt werden. Ist dies ein definiertes Verhalten oder eine spezifische Implementierung?Sind negative boolesche Werte definiert?

(Ich kam, um darüber nachzudenken, als ich in einer Frage sah, jemand zu fördern „wahr“ und „falsch“ in einem Enum als 1 und 0 deklariert)

+0

Alles was nicht "falsch" ist, ist "wahr"? – khachik

+0

Ich denke, dass http://stackoverflow.com/questions/727196/boolean-true-positive-1-or-negative-1 Ihre Frage –

Antwort

23

Dies ist definiert Verhalten. Ich werde für den Absatz C99 aussehen Standard besagt, als solche

§ 6.3.1.2
Wenn ein Skalarwert _Bool umgewandelt wird, ist das Ergebnis 0, wenn der Wert gleich 0 vergleicht; andernfalls ist das Ergebnis 1.

+2

+1 für das Zeigen des Standards beantworten würde. – Jay

+0

+1 Der Standard 'bool' ist gut. Ich benutze eine 'enum' als Fallback für den Fall, dass ein bestimmter Compiler keine C99-Unterstützung hat. –

1

In C gibt es keinen booleschen Typ; 0 und 0.0f werden in booleschen Kontexten als "falsch" betrachtet, alles andere ist "wahr".

Deklarieren "wahr" und "falsch" in einem Enum falsch ist, denn dann wird der folgende Code brechen:

if (2 == TRUE) 

(2 sollte als "wahr", bewerten, aber wenn TRUE definiert ist als 1 , die zwei Werte werden nicht als gleich angesehen).

+1

Jeder, der prüft, ob ein Wert gleich "wahr" ist, ist falsch, da der Test überhaupt nicht durchgeführt werden sollte. Ein 'enum' ist in bestimmten Situationen in Ordnung. –

+0

Es gibt einen booleschen Typ in C99, siehe meine Antwort – SiegeX

+1

Ein Nitpick hier, aber die Enum, wenn verwendet, sieht aus wie ein richtiger boolescher Typ, aber verhält sich nicht wie einer. Deshalb bevorzuge ich es, es nicht zu haben, und verwende stattdessen 0 und 1. – tdammers

2

Ich glaube, 0 ist falsch und alles andere ist wahr.

See @ casper Antwort hier: thread

Ich würde einen Hinweis von C nimmt hier, wo falsch definiert ist absolut als 0, und wahr ist nicht falsch definiert. Dies ist ein wichtiger Unterschied im Vergleich zu einem absoluten Wert für wahr. Wenn Sie keinen Typ haben, der nur zwei Zustände hat, müssen Sie alle Werte innerhalb dieses Werttyps berücksichtigen, was wahr ist und was falsch ist.

2

Dies ist das richtige Verhalten, in C ist Falsch und alles andere ist Wahre

-1

C definiert 0 als falsch und alles andere als wahr. Positiv, negativ, was auch immer.

Ich glaube, ich habe vor kurzem befürwortet die Verwendung von typedef enum { false, true } bool;, also werde ich es besitzen. (Wenn mein Original-Code nicht hatte ein typedef beteiligt, das war eine Fehleinschätzung meinerseits.) Alle Nicht-Null-Werte sind wahr, so würde ich nicht einen Aufzählungs bool Typen für Dinge wie dieser Anwalt mit:

if(x == true) // not what you want 
if(!x == false) // works, but why so much effort? 

Ich bevorzuge einfach if(x) oder if(!x) zu expliziten Tests gegen boolesche Werte. Aber manchmal ist es gut, einen booleschen Typ zu haben:

bool is_something(int x) 
{ // assume for the sake of an argument that the test is reasonably complex 
    if(/* something */) return false; 
    if(/* something else */) return true; 
    return false; 
} 

Dies ist nicht besser als der Typ int sein zu haben, aber zumindest sind Sie ist explizit mit dem, was das Ergebnis soll.

Auch nach jemand anderem über eine bessere bool könnte sein:

typedef enum { false, true = !false } bool; 

Ich glaube ! garantiert 0 oder 1 zurück, aber ich könnte falsch sein, und die oben genannten Arbeiten gut oder so.

+0

Tu das einfach nicht. 'bool',' true' und 'false' sind in" stdbool.h "definiert und machen das Richtige. –

+0

@Jens - Nicht alle Systeme werden C99-Unterstützung haben, vielleicht ist jemand Compiler wirklich alt oder wird von Microsoft gemacht, und es ist so einfach, einen fill-in 'Bool'-Typ zu definieren, falls jemand keinen hat, der Wenn Sie einen 'Bool'-Typ verwenden, können Sie auch ein Backup erstellen. –

+0

Dann sollten Sie besser tun, wie es in C89 vorgesehen ist, nämlich "int" für boolesche Werte zu haben. Und definieren Sie Ihre Ersetzung in einer separaten Datei, die sie als Makros 'bool == int',' false == 0' und 'true == 1' definiert. Andernfalls, sobald Sie einen C99-Compiler haben, wäre dies ein echter Port-Schmerz. –

Verwandte Themen