sobrecarga - operator() c++
Encadenamiento matemático del operador de comparación-como en "if((5<j<= 1))" (4)
Su pregunta está un poco rota, pero creo que lo siguiente aclarará lo que está pasando para usted:
En C, 1 < j <= 5
significa lo mismo que (1 < j) <= 5
. Y el valor de 1 < j
es 0 o 1 dependiendo de si es menor o igual que 1 o estrictamente mayor que 1. Entonces, esto es lo que sucede para unos pocos valores de j en su código:
Si j == 0
, esta expresión es (1 < 0) <= 5
, que se reduce a 0 <= 5
(porque 1 < 0
es falso). Esta es una verdadera expresión. Tu programa muestra "sí".
Si j == 3
, esta expresión es (1 < 3) <= 5
, que se reduce a 1 <= 5
(porque 1 < 3
es verdadero). Esta es una verdadera expresión. Tu programa muestra "sí".
Si j == 6
, esta expresión es (1 < 6) <= 5
, que se reduce a 1 <= 5
(porque 1 < 6
es verdadero). Esta es una verdadera expresión. Tu programa muestra "sí".
En todos los casos, su programa emite "sí" porque 1 < j
es 0 o 1, y de cualquier manera es menor que 5.
Lo que debería haber usado es 1 < j && j <= 5
.
Esta pregunta ya tiene una respuesta aquí:
int j=42;
if( (5<j<=1) ) {
printf("yes");
} else {
printf("no");
}
Salida:
yes
¿Por qué produce yes?
¿No es la condición solo mitad verdadera?
lo que quiere escribir es if ( 1 < j && j <= 5 )
lo que está sucediendo en tu caso es: if ( 1 < j <=5 )
1 < j
se evalúa primero, y es verdadero, por lo que se evalúa a 1 y su condición se vuelve
if (1 <=5)
, que también es verdadero así que printf("yes");
se excuta
Según la precedencia del operador y la asociatividad LR,
1<j
evalúa a 1
1<=5
evalúa a 1
if(1)
{
printf("yes")
C no entiende la sintaxis matemática, entonces
if(1<j<=5)
no se interpreta como espera y quiere; debería ser
if (1 < j && j <= 5)
o similar.
Como se explica en otras respuestas, la expresión se evalúa como
((1 < j) <= 5)
=> ("true" <= 5)
=> "true"
donde "verdadero" (valor booleano) se convierte implícitamente en 1, como explaneid por ejemplo aquí , con referencias a estándares también, y esto explica por qué "verdadero" tiene que ser "menor que" 5 (aunque en C podría no ser totalmente correcto hablar sobre "conversión implícita de bool a int")