uControl
Mayo 24, 2013, 10:40:19 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Duda programación If en c  (Leído 1663 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Waldillo
Moderador
PIC16F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 848


Casado con PIC infiel con ARM


WWW
« : Marzo 14, 2012, 12:15:38 »

Buenas tengo una duda básica que creo saber la respuesta. Lo pongo en pseudocódigo

if ( (TRUE) || (TRUE) || (FALSE)) {

}

Si la sentencia ROJA se presupone TRUE ya no evalua las siguientes no?

if ( (TRUE) && (FALSE) && (FALSE)) {

}

Si la sentencia AZUL se presupone FALSE ya no evalua las siguientes no?

if ( (TRUE) && (FALSE) || (FALSE)) {

}

Como sería en este caso??

Cual es el keyword para buscar esto en google¿? reglas de precedencia?? Gracias de antemano
En línea

E_Blue
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 2133


Electric Blue


« Respuesta #1 : Marzo 14, 2012, 12:43:28 »

En el tercer caso el FALSE te invalida el if, es decir no se ejecuta y creería que el FALSE no se evalúa.
En línea

Procesando...
Si escribes para la (censurado) solo ella va a leerte.

Si quieres ayuda con tu proyecto recuerda agregar información del mismo, y no seas haragán y esperes tener todo servido, esto es un foro, no una bolsa de trabajo.
Felixls
Moderador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 3025



WWW
« Respuesta #2 : Marzo 14, 2012, 01:11:55 »

Bueno, nada mejor que probar la teoría  Grin:


Código:
#include <stdio.h>

void main()
{
  int a,b,c;
  a=1;
  b=0;
  c=0;

  if (a&&b||(++c==a))
  {
    printf("entro %d\n", c);
  }
}

Resultado


$ gcc test.c
$ ./a.out
entro 1

&& tiene más prioridad que ||

Conclusión: Se evalua toda la expresión, primero el && asociado de izquierda a derecha y luego el ||

saludos.
En línea
Waldillo
Moderador
PIC16F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 848


Casado con PIC infiel con ARM


WWW
« Respuesta #3 : Marzo 14, 2012, 01:48:21 »

Muchas gracias. Que keyword podria utilizar en google para leer sobre el tema?
En línea

SavageChicken
Amigo de uControl
PIC12F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 248


Las oportunidades son puertas sin abrir


« Respuesta #4 : Marzo 23, 2012, 01:58:18 »

Creo que para asegurarse es mejor usar mayor cantidad de paréntesis, entonces

Si quieres que evalue el && primero:  ((A&&B)||C)
Si deseas que evalue el || primero:  (A&(B||C))

No se, me parece a mi que de esta manera te aseguras de que se avalúe primero lo que tu quieres o necesitas...  Grin
En línea

No hay preguntas tontas...
Solo hay tontos que no preguntan.
BrunoF
Moderador
PIC16F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 722



« Respuesta #5 : Marzo 23, 2012, 09:08:51 »

Hay que tener en cuenta 3 reglas:

1)Por defecto, el parser analiza de izquierda a derecha, y de arriba hacia abajo. 2)Si una sentencia involucra varios operadores, se ejecutan según una prioridad pre-establecida en el parser, de mayor a menor prioridad. 3)Los paréntesis permiten explicitar y/o modificar el orden de ejecución. Por lo general, la mayoría de los parseadores evalúan toda la expresión, aún cuando no hace necesariamente falta, debido a que el resultado es inminente.

Ojo que en este caso:

Código:
void main()
{
  int a,b,c;
  a=1;
  b=0;
  c=0;

  if (a&&b||(++c==a))
  {
    printf("entro %d\n", c);
  }
}

& es distinto de &&. & es AND aritmético y && es AND lógico.

Por ejemplo, no es lo mísmo:

       1 & 2 = 0
que
       1 && 2 = 1

Por otro lado, tu conclusión es correcta(&& efectivamente tiene asignada mayor prioridad que ||) pero el ejemplo no es prueba suficiente de ello.
Para poder comprobar que efectivamente un operador tiene mayor prioridad sobre otro(si no logramos encontrar la tabla de prioridades del lenguaje, que sería más sencillo) debemos colocar el operador que creemos que tiene mayor prioridad que el otro en un ejemplo más, pero a la DERECHA, para darle la posibilidad al supuesto de menor prioridad a poder nuevamente ser pospuesto en su ejecución aún teniendo la ventaja por defecto de encontrarse a la IZQUIERDA del otro.

por ende , haciendo además del ejemplo anterior:

Código:
 if ((++c == a) || a && b)
  {
    printf("entro %d\n", c);
  }

nuevamente logra ingresar demostrando, entonces sí, que indudablemente el operador && tiene mayor prioridad que el ||.
Los () son los que mayor prioridad poseen, por lo que el orden puede adulterarse explícitamente:

Código:
 if (((++c == a) || a) && b)
  {
    printf("entro %d\n", c);
  }
Logrando que no se logre satisfacer la condición y por lo tanto que no se imprima nada.
« Última modificación: Marzo 23, 2012, 09:12:59 por BrunoF » En línea
jukinch
Amigo de uControl
PIC12F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 108



« Respuesta #6 : Abril 12, 2012, 11:57:37 »

Hola.
El keyword para estudiar sobre el tema es: operadores logicos en cortocircuito.
       Saludos a todos
               Jukinch
En línea
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.18 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.388 segundos con 29 consultas. (Pretty URLs adds 0.009s, 3q)
loggkey