2011-12-23 13 views
34

¿Está !!(x) garantizado por el estándar para devolver 0/1?doble negación en C: ¿se garantiza que devolverá 0/1?

Tenga en cuenta que soy no preguntando por C++, donde se define un tipo bool.

+1

Qué estándar? –

+0

@DanFego: ha tenido un comportamiento bien definido desde que C se estandarizó por primera vez, por lo que el estándar no debería importar. – jamesdlin

+1

posible duplicado de [¿Qué es! 0 en C?] (Http://stackoverflow.com/questions/3661751/what-is-0-in-c) – jamesdlin

Respuesta

42

Sí, en C99, ver §6.5.3.3/4:

El resultado del operador negación lógica! es si el valor de su operando compara desigual a 0, si el valor de su operando compara igual a 0. El resultado ha escriba int. La expresión! E es equivalente a (0 == E).

Así !x y !!y sólo puede producir 0 o 1, como int s.

Para otros operadores, en C99, consulta Is the "true" result of >, <, !, &&, || or == defined?

+1

gracias. solo si tiene curiosidad por qué: lo estoy usando para la competencia uni, donde mi código se ejecutará sin optimizaciones gcc, encontré usando '!! x' disminuyendo el tiempo mi código en ~ 5% luego' x = (x? 1: 0) '. De todos modos, gracias por la cita de la norma, fue muy útil. – amit

14

Este es un comentario de verdad, pero es demasiado largo. (Por favor, no lo vote solo sobre esa base.)

Encontré un documento muy extraño mientras buscaba el estándar para responder a su pregunta: The New C Standard: An Economic and Cultural Commentary. Y dicen que la academia no cuenta con los fondos suficientes. (Here es el PDF completo de 2083 páginas de 10.5MB. El primer enlace es solo la sección de doble negación.)

Tiene esto que decir sobre el tema de la doble negación: "Un doble negativo se interpreta a menudo como una declaración positiva en inglés (p. ej., "No es desconocido que ocurran dobles negativos en la fuente C"). La misma semántica que se aplica en C. Sin embargo, en algunos idiomas (p. ej., español), un doble negativo se interpreta como el enunciado más negativo (este uso ocurre en el habla informal en inglés, por ejemplo, "no has visto nada todavía", pero es raro y está mal visto socialmente en 1). "

creo que el autor estaría feliz sabiendo que esto es de ninguna utilidad para responder a su pregunta real (cuya respuesta es sí.)

+0

¡Por favor, vota a este chico para el esfuerzo de investigación! –

+1

el criterio para votar es útil, y esta respuesta, como dijiste, "no sirve para nada". –

+2

@PeteKirkham, respetuosamente estoy en desacuerdo, al igual que las preguntas frecuentes: * "Use sus votos siempre que encuentre una publicación extremadamente descuidada, sin esfuerzo, o una respuesta que sea clara y quizás peligrosamente incorrecta." De todos modos, feliz Navidad y Feliz año nuevo. –

Cuestiones relacionadas