2011-03-28 7 views

Respuesta

7

i=x<y<z;, consigue interpretar como i=(x<y)<z, que a su vez consigue interpretar como i=1<z, que evalúa a 1.

+0

Parece ser un error bastante común, al menos GCC (probablemente otros compiladores, también) imprime una advertencia, si las advertencias se habilitan: 'advertencia: las comparaciones como 'X <= S < = Z' no tienen su meaning' matemática – Saytonurn

0

Esto se debe a que su código se evalúa como:

void main() 
{ 
    int x=10,y=20,z=5,i; 
    i=((x<y)<z); //(x<y) = true = 1, (1 < 5) = true 
    printf("%d",i); 
} 
+0

¿Cómo se puede cambiar el código y hablar acerca de la evaluación? – Sadique

+0

puse apoyos para ilustrar cómo compilador de código interpretado –

0

lo que hizo que la salida ¿querer?

En C,

i = 2 < 3; //i == 1. 
i = 4 < 3; //i == 0. 

Si la condición se evalúa como falsa, el valor devuelto es 0, y 1 en caso contrario.
También, x < y < z será evaluado como ((x < y) < z).

2

10 es menos de 20, lo que resulta en 1 y 1 es menor que 5, lo que resulta en 1. C no encadena operadores relacionales como hacen otros idiomas.

0
x<y // 1 as (10 < 20) will return 1 
result of(x<y)<z // 1 as (1<5) will return 1 
1

opera como sigue: Desde < es una expresión lógica, x<y es decir 10<20 es cierto es decir 1. Por lo tanto, se convierte en 1<z es decir 1<5 que de nuevo es verdadero es decir, 1 que se asigna a i. Así es i 1.

0

C++ no admite comparaciones múltiples piezas por el estilo.

x < y < z 

se interpreta como

(x < y) < z 

o es decir, determinar si x < y, luego ver si que boolean es menor que z.

Hay un poco de discusión en por qué que es over at the software engineering StackExchange.

Cuando usted se encuentra tratando de hacer esto, en lugar que necesita para escribir como dos comparaciones separadas unidas por un valor lógico:

(x < y) && (y < z) 
Cuestiones relacionadas