2010-02-23 21 views
11

¡He estado usando! (negación lógica) en C y en otros idiomas, tengo curiosidad ¿alguien sabe cómo hacer los suyos propios? ¿función? o tienes una forma creativa de hacer uno?¿Cómo funciona la negación lógica en C?

+2

Cuando habla de un "método", parece que puede estar hablando de C++. Puede escribir una función que haga una negación lógica en C, ¡pero no puede anularla! operador. C++ le permite escribir un operador! - ya sea un método o una función no miembro, pero eso es C++, no C. – Steve314

+0

No fue tan fácil como me pareció encontrar una pregunta y respuesta con la parte del estándar que dice que '!' devuelve 1 si la entrada es 0 (a diferencia de cualquier otro valor distinto de cero de una manera dependiente del compilador), pero es [C99 estándar 6.5.3.3] (http://stackoverflow.com/questions/7945950/is-logical-negation-of- zero-0-compiler-dependent-in-c). Solo para tu información. – HostileFork

Respuesta

21
int my_negate(int x) 
{ 
    return x == 0 ? 1 : 0; 
} 
+1

eso es mejor :) –

+1

No puedo creer que me las haya arreglado para hacerlo :-p –

+0

Me pasa todo el tiempo. Escribiré algo, pero realmente significa exactamente lo contrario. –

6

!e pueden ser reemplazados por ((e)?0:1)

1

Si desea sobrecargar un operador, el prototipo adecuado es:

bool operator!(); 

No soy un gran fan de la sobrecarga de operadores, pero algunos A las personas les gusta su azúcar sintáctico. EDITAR: ¡Esto es solo C++! Ponlo en la definición de tu clase.

+0

Los operadores de sobrecarga funcionan bien con plantillas. Solo asegúrate de que 'operator!()' Tenga la misma semántica que '!'. –

+0

Si lo pones en la definición de la clase, no toma argumentos y funciona en * this. bool operator!() const; El prototipo que muestre podría usarse para una definición de operador amigo. –

+0

Derecha. Buen caso de uso para sobrecargar a un operador. Sin embargo, si no tenía una buena razón para eso, el operador no suele ser tan intuitivo como una función bien nombrada. Sin embargo, siempre hay excepciones. – thebretness

5

Recuerde el operador bang '!' o signo de admiración en inglés, está integrado en el lenguaje de programación como un medio para negar.

Considere este ejemplo operador ternario:

 
(some condition) ? true : false; 

Ahora, si eso fue negada, el operador ternario sería este

 
(some condition) ? false : true; 

El área común donde eso puede conseguir algunos programadores en un poco de un ajuste es la función strcmp, que devuelve 0 para las cadenas que son iguales, y 1 para dos cadenas no iguales:

 
if (strcmp(foo, "foo")){ 

} 

cuando en realidad debería ser:

 
if (!strcmp(foo, "foo")){ 
} 

En general, cuando cambia el signo, es todo lo contrario, como se muestra en el ejemplo de operador ternario ...

Espero que esto ayude.

+0

'strcmp' devuelve 0 para cadenas del mismo modo; devuelve un número negativo (no necesariamente -1) si la primera cadena precede al segundo, y un número positivo (no necesariamente +1) si la primera cadena sigue al segundo, donde el orden se basa en los valores de byte del (sin signo) caracteres que componen las cuerdas. –

+0

@Jonathan: Correcto, -1 se considera verdadero ... ya que es el máximo sin signo int ... es decir. 0xFFFF ... es decir. distinto de cero, independientemente de cuándo -ive o + 'ive – t0mm13b

+0

Su respuesta dice' la función strcmp, que devuelve 0 para las cadenas que son iguales, y 1 para dos cadenas que no son iguales '. Esto es incorrecto; devuelve un valor distinto de cero para dos cadenas que no son iguales, no 'incondicionalmente 1 si las cadenas son diferentes'. –

3

C considera que todos los valores distintos de cero son "verdaderos" y cero "falsos". La negación lógica se hace comprobando contra cero. Si la entrada es exactamente cero, da salida a un valor distinto de cero; de lo contrario, salida cero. En el código, puede escribir esto como (input == 0) ? 1 : 0 (o puede convertirlo en una declaración if).

Cuando pregunta cómo "hacer su propio método", ¿quiere decir que quiere escribir una función que niega un valor lógico o quiere definir lo que hace el operador de exclamación? Si el primero, entonces la declaración que publiqué arriba debería ser suficiente. Si esto último, entonces me temo que esto es algo que no se puede hacer en C. C++ apoya la sobrecarga del operador, y si hacer esto es una necesidad estricta, entonces sugeriría que busquen allí.