2010-11-08 10 views
12

Pregunta extraña, pero alguien me mostró esto, Me preguntaba si puedes usar el no! operador para int en C++? (es extraño para mí).no operador en C++ para int?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a=5, b=4, c=4, d; 
    d = !(a > b && b <= c) || a > c && !b; 
    cout << d; 
    system ("pause"); 
    return 0; 
} 
+2

este es un código críptico, no fácil de leer, con un nombre sin sentido para las variables. 'd =! (a> b && b <= c) || a > c && !b;' Por favor, programe limpiamente: Elija buenos nombres, y no multiplique la operación numerosa en una sola línea. –

+9

@Stephane: "alguien me mostró esto". Si el interlocutor no lo hizo escriba el código, ¿cómo llevar a cabo sus instrucciones? Da la casualidad, solo el '! b' es relevante para la pregunta, por lo que el resto podría descartarse, pero dado que el interlocutor no entiende el operador'! ', esto podría no ser obvio. –

+0

@Steve.De acuerdo, pero me he encontrado con esos nombres de variables tan a menudo ... –

Respuesta

23

Sí. Para tipos integrales, ! devuelve true si el operando es cero y false de lo contrario.

Así que !b aquí solo significa b == 0.


Este es un caso particular en que un valor se convierte a un bool. El !b se puede ver como !((bool)b) por lo que la pregunta es cuál es la "veracidad" de b. En C++, los tipos aritméticos, tipos de punteros y enum se pueden convertir a bool. Cuando el valor es 0 o nulo, el resultado es false, de lo contrario es true (C++ §4.1.2).

Por supuesto clases personalizadas, incluso puede sobrecargar el operator! o operator < tipos se pueden convertir a bool> para permitir que el !b para sus clases. Por ejemplo, std::stream ha sobrecargado el operator! y operator void* para comprobar la failbit, de manera que los modismos como

while (std::cin >> x) { // <-- conversion to bool needed here 
    ... 

se puede utilizar.

(Pero su código !(a > b && b <= c) || a > c && !b es sólo críptica.)

3

La prueba para int es cierto para los valores distintos de cero y falso de valores cero, por lo que no es sólo cierto para los valores cero y falso de valores distintos de cero .

4

Puede, !b es equivalente a (b == 0).

3

El operador ! incorporado convierte su argumento a bool. El estándar especifica que existe una conversión de cualquier tipo aritmético (int, char, .... float, double ...) a bool. Si el valor de origen es 0 el resultado es true, de lo contrario es false

5

Originalmente, en C (en el que se basa C++) no había ningún tipo de Boole. En cambio, el valor "verdadero" se asignó a cualquier valor distinto de cero y el valor "falso" se asignó a todo lo que se evalúa como cero. Este comportamiento todavía existe en C++. Por lo tanto, para un int x, las expresiones !x significan "x no verdadero", que es "x no diferente de cero", es decir, es verdadero si x es cero.

+0

¡genial! ¡muchas gracias! – 001