2010-09-07 23 views
16

Sé que en C, para las declaraciones if y las comparaciones FALSE = 0 y cualquier otra cosa es igual a verdadero.¿Qué es! 0 en C?

Por lo tanto,

int j = 40 
int k = !j 

k == 0 // this is true 

Mi pregunta se ocupa de todo lo contrario. ¿En qué se convierte! 0? 1?

int l = 0 
int m = !l 

m == ? // what is m? 
+12

¿Por qué no intentarlo? –

+1

@Josh K: Consejo perfecto. Ojalá todos lo intenten primero, y luego pregunten por los resultados que * en realidad * obtuvieron. –

+13

@Josh K: Porque bien puede variar según el compilador/estándar/día de la semana (si no es un comportamiento definido, por ejemplo, aunque obviamente lo es en este caso), por lo que ver un solo valor de resultado puede no reflejar exactamente lo que estará en cualquier otra configuración dada. –

Respuesta

30

operadores booleanos/lógicas en C son requieren d para producir ya sea 0 o 1.

Desde sección 6.5.3.3/5 de la norma ISO C99:

El resultado del operador negación lógica ! es 0 si el valor de su operando compara desigual a 0, 1 si el valor de su operando compara igual a 0.

de hecho, !!x es un lenguaje común para forzar un valor a ser 0 o 1 (I personalmente prefiero x != 0, aunque).

Ver también Q9.2 from the comp.lang.c FAQ.

+3

Buena llamada. Parece que más de nosotros necesitamos leer el maldito estándar ISO. –

+4

+1 para apuntar al estándar, pero el código que usa '!!' necesita dirigirse directamente al cubo de basura. –

+0

Por supuesto, no muchos compiladores de C se sienten particularmente obligados a seguir el estándar ISO. GCC probablemente, pero con cualquier otra persona es un juego de dados. –

1

general, sí, que va a convertirse 1. Dicho esto, incluso si lo que se garantiza que el comportamiento (que no estoy seguro de) que consideraría código que se basó en que para ser bastante horrible.

Puede suponer que es un valor real. No asumiría nada más.

+8

No solo en general; *siempre*. Los operadores booleanos en C deben devolver 0 o 1. – jamesdlin

+0

Aún así, se siente como una violación al hecho de que tu código muestre intenciones. –

+2

No, en absoluto. Cosas como 'prefix =" - "+! Neg;' están perfectamente sanas C. –

1

operador de The Big Bang (!) Es el operador lógico encuentra comúnmente en C, C++ y C#, así

!0 == 1 
!1 == 0 

Esto se basa en el lenguaje característico de lo que se interpreta a ser verdadera o falsa. .. en más idiomas modernos, sería como esto

!false == true 
!true == false 

Ver DeMorgan Ley sobre tablas de verdad ...

+3

En realidad, en C++, '!' Toma un operando 'bool' y produce un resultado' bool' - aunque por compatibilidad con versiones anteriores, hay conversiones implícitas de 'bool' a' int', con 'true' convirtiendo a' 1 'y' falso' a '0', y de otros tipos enteros a' bool', con '0' converting a' false', y cualquier otro valor que se convierta en 'true'. –

3

§6.5.3.3/5: "El resultado del operador de negación lógica! Es 0 si el valor de su operando se compara con 0, 1 si el valor de su operando es igual a 0. El resultado tiene un tipo int "

Los otros operadores lógicos (por ejemplo, &&, ||) siempre producen 0 o 1 también.

0

!x será ampliar a (x==0) manera:

  • si x = 0 ->!x toma el valor de (0==0) = VERDADERO (valor 1)
  • si x = 0 ->!x valor de toma de (x==0)! = FALSE (valor 0)