Error en C: (Ivalue required as left...)

Iniciado por Constantinoplero, 13 Noviembre 2011, 02:53 AM

0 Miembros y 1 Visitante están viendo este tema.

Constantinoplero

Buenas noches, estoy haciendo un ejercicio voluntario de Informática en C, y vuelvo a tener una duda con el error que me arroja Codeblocks, como ya paso unos días cuando estaba estudiando por mi cuenta.

El programa debe pedir un día, comprobar que sea correcto (1-31), lo mismo con los meses (1-12) y si sale 29 de febrero, asegurarse que es posible porque sea bisiesto.


    if (dia>=1 && dia<=31 && mes=1 || mes=3 || mes=5 || mes=7 || mes=8 || mes=10 || mes=12)
        printf("Hoy es %u del %u.", dia, mes);


En esta parte del código me sale un error diciendo: 'lvalue required as left operand of assignment'. Concretamente aparece en la línea del if.

¿Por qué aparece? ¿Se puede poner todo eso en la misma línea o debo separarlos?
P.D.: Tengo que hacer el programa con if y con switch, por eso está así.

Saludos.
Más que buenos principios prefiero mejores finales.

rir3760

El error se genera debido a que en la condicion del "if" estas utilizando el operador de asignacion '=' cuando deberia ser el de comparacion '==', de esta forma:
if (dia >= 1 && dia <= 31
   && mes == 1 || mes == 3 || mes == 5 || mes == 7
   || mes == 8 || mes == 10 || mes ==12
)
   printf("Hoy es %u del %u.", dia, mes);


Pero con ese cambio no funcionara correctamente si la intencion es verificar que el dia este en el rango 1 .. 31 y el mes sea el indicado (1, 3, 5, 7, 8, 10 o 12) ya que el operador "&&" tiene mayor prioridad que el operador "||".

La forma correcta es utilizando parentesis:
if (dia >= 1 && dia <= 31
   && (mes == 1 || mes == 3 || mes == 5 || mes == 7
   || mes == 8 || mes == 10 || mes == 12)
)
   printf("Hoy es %u del %u.", dia, mes);


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Constantinoplero

Lo de los paréntesis lo leí buscando, pero como igualaba en vez de comparar seguía saliendo error...

Gracias por la ayuda!

Por cierto, ¿cómo hacéis para poner en colores el código aquí?
Más que buenos principios prefiero mejores finales.

DickGumshoe

En el menú de "responder", en un cuadro pone "Cambiar color", ahí no es, es justo en el de arriba. Donde pone "GeSHi", seleccionas el lenguaje que estás usando, y metes ahí el código.