Encadenamiento múltiple mayor que / menor que operadores.

En una sentencia if quiero incluir un rango, por ejemplo:

 if(10 < a < 0) 

pero al hacerlo, recibo una advertencia “Comparación sin sentido“. Sin embargo, esto funciona bien sin ninguna advertencia:

 if(a>10 && a<0) 

¿Es posible implementar el primer caso en C?

Tenga en cuenta que la versión original es perfectamente legal; simplemente no hace lo que podría (razonablemente) pensar que hace. Tienes la suerte de que el comstackdor lo reconoció como un error probable y te lo advirtió.

El operador < asocia de izquierda a derecha, igual que el operador + . Entonces, al igual que a + b + c realmente significa (a + b) + c , a < b < c realmente significa (a < b) < c . El operador < produce un valor int de 0 si la condición es falsa, 1 si es verdadera. Entonces, o estás probando si 0 es menor que c, o si 1 es menor que c.

En el improbable caso de que eso sea realmente lo que quieres hacer, agregar paréntesis probablemente silenciará la advertencia. También le asegurará a cualquiera que lea su código más adelante que usted sabe lo que está haciendo, por lo que no lo "arreglan". (De nuevo, esto se aplica solo en el caso poco probable de que realmente desee (a < b) < c) .)

La forma de verificar si a es menor que b y b es menor que c es:

 a < b && b < c 

No es posible, tiene que dividir el cheque como lo hizo en el caso 2.

No, no es posible.
Tienes que usar la segunda forma dividiendo los dos controles condicionales.

El primero hace una comparación, luego compara el resultado del primero al segundo valor. En este caso, los operadores se agrupan de izquierda a derecha, por lo que es equivalente a (10 . La advertencia que le está dando es realmente porque < siempre dará 0 o 1. La advertencia le dice que el resultado de la primera comparación nunca puede ser menor que 0, por lo que la segunda comparación siempre será falsa.

A pesar de que el comstackdor no se quejará de ello, el segundo no es realmente una gran mejora. ¿Cómo puede un número ser simultáneamente menor que 0, pero mayor que 10? Lo ideal es que el comstackdor le avise que la condición siempre es falsa. Es de suponer que quiere 0 a>0 && a<10 .

Puede obtener el efecto del segundo usando solo una comparación: if ((unsigned)a < 10) será verdadero solo si el número está en el rango de 0..10. Una comparación de rango normalmente se puede reducir a una sola comparación con código como:

 if ((unsigned)(x-range_start)<(range_end-range_start)) // in range else // out of range. 

Hubo un tiempo en que este era un elemento básico de la progtwigción decente en lenguaje ensamblador. Sin embargo, dudo que muchas personas lo hagan (ciertamente no lo hago por regla general).

Como se indicó anteriormente, hay que dividir el cheque. Piénselo desde el punto de vista del comstackdor, que mira a un operador a la vez. 10

no, esta no es una syntax válida de la sentencia if, debe tener una expresión constante válida, o puede tener operadores lógicos, y se ejecuta solo cuando la expresión en el corchete se evalúa como verdadera o no tiene valor cero