2010-11-23 19 views
10

En C, al menos cada valor positivo excepto 0 se trata como un valor booleano verdadero. Pero, ¿qué pasa con un valor negativo? Hice algunas pruebas y parece que también los valores negativos se tratan como un verdadero booleano. ¿Es esto un comportamiento definido o una implementación específica?¿Están definidos los valores booleanos negativos?

(llegué a pensar en esto cuando vi en una pregunta, alguien promoción de declarar "verdadero" y "falso" en una enumeración como 1 y 0.) el comportamiento

+0

Todo lo que no es 'falso' es' verdad'? – khachik

+0

Creo que esto http://stackoverflow.com/questions/727196/boolean-true-positive-1-or-negative-1 respondería a su pregunta –

Respuesta

23

Esto se define. Voy a buscar el párrafo estándar C99 indica como tal

§ 6.3.1.2
Cuando cualquier valor escalar se convierte en _Bool, el resultado es 0 si el valor se compara igual a 0; de lo contrario, el resultado es 1.

+2

+1 para señalar el estándar. – Jay

+0

+1 El 'bool' estándar es bueno. Utilizo un 'enum' como respaldo en caso de que un compilador particular carezca de compatibilidad con C99. –

1

En C, no hay ningún tipo booleano; 0 y 0.0f se consideran "falsos" en contextos booleanos, todo lo demás es "verdadero".

declarando "verdadero" y "falso" en una enumeración es malo, porque entonces el siguiente código se romperá:

if (2 == TRUE) 

(2 debe evaluar como "verdadero", pero si es cierto se ha definido como 1 , los dos valores no se consideran iguales).

+1

Cualquiera que pruebe si un valor es igual a 'verdadero' es incorrecto, ya que la prueba no debería hacerse en primer lugar. Un 'enum' está bien en ciertas situaciones. –

+0

Hay un tipo booleano en C99, ver mi respuesta – SiegeX

+1

Siendo un nitpick aquí, pero el enum, cuando se usa, parece un tipo booleano apropiado pero no se comporta como uno. Es por eso que prefiero no tenerlo en primer lugar, y solo uso 0 y 1 en su lugar. – tdammers

2

Creo que 0 es falso y todo lo demás es verdadero. respuesta

Ver @ de Casper aquí: thread

me tomaría un indicio de C aquí, donde falsa se define como absolutamente 0, y se define como verdadera, no falsa. Esta es una distinción importante, cuando se compara con un valor absoluto para verdadero. A menos que tenga un tipo que solo tenga dos estados, debe contabilizar todos los valores dentro de ese tipo de valor, lo que es verdadero y lo que es falso.

2

Este es el comportamiento correcto, en C es Falso y todo lo demás esverdadera

-1

C define 0 como falso y todo lo demás como verdadero. Positivo, negativo, lo que sea.

Creo que recientemente recomendé el uso de typedef enum { false, true } bool;, así que lo reconoceré. (Si mi código original no tenía un typedef involucrados, que fue un error de juicio de mi parte.) Todos los valores distintos de cero son verdaderas, por lo que no estaría a favor de usar un enumerado bool tipo para cosas como esta:

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

Generalmente permito simplemente if(x) o if(!x) para pruebas explícitas contra valores booleanos. Sin embargo, a veces es bueno tener un tipo booleano:

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; 
} 

Esto no es mejor que tener el tipo sea int, pero al menos estás siendo explícita con lo que el resultado se ha diseñado.

También, de acuerdo con otra persona anteriormente, una mejor bool podría ser:

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

creo ! está garantizado para devolver 0 o 1, pero podría estar equivocado, y lo anterior funciona así de cualquier manera.

+0

Simplemente no hagas eso. 'bool',' true' y 'false' se definen en" stdbool.h "y hacen lo correcto. –

+0

@Jens: no todos los sistemas tendrán soporte C99, tal vez el compilador de alguien sea muy antiguo o esté hecho por Microsoft, y es tan fácil definir un tipo 'bool' en caso de que alguien no tenga uno que si ' va a utilizar un tipo 'bool' en primer lugar, es posible que también tenga una copia de seguridad. –

+0

Entonces será mejor que haga lo que se prevé en C89, es decir, que tenga 'int' para los valores booleanos. Y defina su reemplazo en un archivo separado que los defina como macros 'bool == int',' false == 0' y 'true == 1'. De lo contrario, una vez que tenga un compilador C99, esto sería un verdadero dolor a babor. –

Cuestiones relacionadas