Dado que x = 2, y = 1, z = 0, ¿cuál será el siguiente display comunicado ?
printf ("respuesta =% d \ n", (x ||! Y & & z));
Ok - sintiéndose un poco culpable por la dura chiste re mala redacción de la pregunta, así que voy a tratar de ayudarle de una manera diferente a las otras respuestas ... :-)
Cuando usted tiene una pregunta como esta, desglose en trozos manejables.
Probar:
int x = 2, y = 1, z = 0;
printf("true == %d\n", 10 > 2); // prints "1"
printf("false == %d\n", 1 == 2); // prints "0"
printf("!y == %d\n", !y); // prints "0"
printf("(x || !y) == %d\n", x || !y); // "1" - SEE COMMENTS BELOW
printf("(!y || z) == %d\n", !y || z); // "0"
printf("(x || !y && z) == %d\n", x || !y && z); // "1"
En la salida de allí, usted tiene todo lo necesario para deducir lo que está sucediendo:
true == 1
revela cómo C/C++ convertir expresiones booleanas veraces a la el valor integral 1 para printf, independientemente de los valores que aparecen en la expresión booleana
false == 0
, muestra cómo C/C++ convierte f alse expresiones a "0"
(!y) == 0
porque! es la lógica no operador, y C/C++ considerar 0 ser el único valor entero correspondiente a falso, mientras que todos los demás son verdaderas, por lo !1 == !true == false == 0
(x || !y) == 1
, y usted sabe !y
es 0, por lo que la sustitución de los valores conocidos y simplificar: (2 || 0) == 1
es equivalente a (true or false) == true
... que es comprensible como una regla lógica
(!y || z) == 0
- sustituyendo los valores conocidos: (0 || 0) == (false or false) == false == 0
(x || !y && z) == 1
: aquí está el crujido! Desde arriba, lo sabemos:
x || !y
es 1/cierto, que en su caso implicaría 1/true & & z/0/falso == 1/true < - esto claramente no tiene ningún sentido, por lo que debe ¡No sea la forma en que C/C++ está calculando la respuesta!
- (! Y & & z) es falso, lo que implicaría x/2/verdadero || falso == 1/verdadero < - esto es cierto, por lo que debe ser el orden implícito.
De esta manera, hemos deriva la prioridad de los operadores - el orden de evaluación de la || y & & operadores, a partir de los resultados que muestra el compilador, y visto que si y solo si & & se evalúa antes || entonces podemos tener algún sentido de los resultados.
"¿Qué mostrará la siguiente declaración?" Ve a ejecutarlo tú mismo ... yikes. Si luego no comprende y desea preguntar "¿por qué?", * Esa es * una pregunta razonable. –
Lo sé, lo hice, pero eso no me explica la lógica detrás de la operación:/ – mayotic
Posiblemente duplicado: http://stackoverflow.com/questions/3375041 – jweyrich