• Viernes 15 de Noviembre de 2024, 00:47

Autor Tema:  Duda Acerca De La Evaluación De Una Condición.  (Leído 2158 veces)

NEXTOR

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Duda Acerca De La Evaluación De Una Condición.
« en: Sábado 8 de Mayo de 2004, 01:41 »
0
Hola. Acabo de ver en un libro de programación algo que creo que es incorrecto. A ver si algún experto en C puede confirmármelo.

Dado el siguiente código:

Código: Text
  1.  
  2. if(a!=0 && 10/a<1){
  3.  
  4. ...
  5.  
  6. }
  7.  
  8.  

Según mis conocimientos, la evaluación de una condición termina en cuanto alguna parte de la misma la hace FALSE, o bien cuando termina del todo. En el ejemplo anterior, si a==0 no hay peligro de que el código llegue a realizar una división por 0 ("10/a") ya que "a!=0" obliga a que la condición entera sea FALSE y no hace falta seguir evaluandola.

Sin embargo, en un libro he visto algo parecido a esto:

Código: Text
  1.  
  2. if(a==0 || 10/a>=1){
  3.  
  4. ...
  5.  
  6. }
  7.  
  8.  

En este caso, si simplemente a==0 la condición completa es TRUE. La pregunta es: ¿Se sigue evaluando la condición si alguna parte de la misma la hace TRUE? En caso afirmativo obtendríamos error por división por cero.

¿Qué opináis?
Gracias.
Néxtor

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Duda Acerca De La Evaluación De Una Condición.
« Respuesta #1 en: Sábado 8 de Mayo de 2004, 02:02 »
0
tal como lo has dicho
si la condicion es OR entra con que cualquiera de las condiciones  se cumplam, aiq eues probable que este caso exista division por 0.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Duda Acerca De La Evaluación De Una Condición.
« Respuesta #2 en: Sábado 8 de Mayo de 2004, 03:06 »
0
Si según el libro el operador && deja de evaluarse cuando un valor es FALSE y retorna FALSE, es de suponer que el || hará lo mismo cuando se encuentre con un TRUE. Ahora bien, no sé qué dice la especificación de C sobre esto, o si lo deja al libre albedrío del compilador. En este caso lo mejor que puedes hacer es comprobarlo con varios compiladores, a ver cómo se comportan o, en caso de duda, asumir que evalúa la expresión completa y así evitarte problemas (incluso de portabilidad si se comporta de manera diferente en cada compilador).

Dudo tanto porque sí que hay lenguajes donde he leido explicitamente esto, pero en C no recuerdo habermelo planteado nunca.

Un saludo.

Ruben3d

NEXTOR

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda Acerca De La Evaluación De Una Condición.
« Respuesta #3 en: Sábado 8 de Mayo de 2004, 05:29 »
0
¡Qué rapidez! Así da gusto entrar en este foro. Muchas gracias a los dos por contestarme. :gracias:

Es algo que tenía en mis apuntes y siempre lo he tenido presente, pero leyendo el libro de "Programación de Windows" me he encontrado con este caso. Está claro que es un error en el listado.

Muchas gracias de nuevo.
Néxtor

Noel Solw

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Re: Duda Acerca De La Evaluación De Una Condición.
« Respuesta #4 en: Jueves 27 de Mayo de 2004, 22:00 »
0
Quisiera dejar claro que en ninguno de los dos ejemplos hay peligro de division por cero. por que como bien dice Ruben, asi como la evaluacion de && se interrumpe cuando alguna de las condiciones es FALSA (es suficiente que una de las condiciones es falsa, para que el resultado tambien lo sea), la evaluacion de ||
se interrumpe cuando llegamos a un expresion VERDADERA (es suficiente que una de las condiciones es verdadera, para que el resultado tambien lo sea).
Para mayor precision ver Kernighan Ritchie, programming in C, section 2.6, page
41.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Duda Acerca De La Evaluación De Una Condición.
« Respuesta #5 en: Jueves 27 de Mayo de 2004, 22:18 »
0
Gracias por precisarlo.

Un saludo.

Ruben3d

C++ BorlFJ

  • Miembro activo
  • **
  • Mensajes: 52
    • Ver Perfil
    • http://www.grafmarc.com.ve/info_lenguajes
Re: Duda Acerca De La Evaluación De Una Condición.
« Respuesta #6 en: Jueves 27 de Mayo de 2004, 22:58 »
0
Colegas existe un problema grave

 si se pregunta por algo que sea igual a cero para luego compararlo con una irreal no es algo cierto. su resultado es falacia y por caso extremo erroneo

si preguntamos con un if (condición==0 /*y luego*/ || 10/condición>=1)

Citar
if(a==0 || 10/a>=1){

...

}

es totalmente erroneo. porque no se puede comparar una variable contra cero cuando se compara con una división. tal como lo expresa uno de nuestros colegas (Noel Slow). si pasa por la pared de que condición=0 no pasará por la pared que dice que 10/condición>=1 es imposible de pasar asique ojo con esas condiciones se tiene que tener en claro lo que se hace y no lo que se ejecuta. el analisis es lo primero.


saludos colegas programadores

C++ BorlFJ
La Fuente de la vida es querer hacer las cosas como son
JC Vermudez

Noel Solw

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Re: Duda Acerca De La Evaluación De Una Condición.
« Respuesta #7 en: Viernes 28 de Mayo de 2004, 08:51 »
0
Estimado BorlF : la expresion  if(a == 0 || 10/a >= 1)
traducida al castellano quedaria :

"Si a es cero o (10/a) mayor o igual a 1".

Hay aqui dos condiciones ligadas por el signo "or".
No es que preguntamos la primera condicion para luego revisar la segunda.
Logicamente el asunto es : si la primera condicion es verdadera no hace falta revisar la segunda, y esa es la causa que el programa no lo hace.
(10/a) se calcula solamente si la primera condicion resulto falsa.
No se si traduzco bien, esto se llama "optimalizacion de las expresiones boleanas".

Saludos al Sr Borland

NEXTOR

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda Acerca De La Evaluación De Una Condición.
« Respuesta #8 en: Martes 1 de Junio de 2004, 16:02 »
0
He buscado por Internet y efectivamente vale tanto para OR como para AND. Estos casos lo denominan como "evaluación en cortocircuito", short-circuit evaluation. Aquí he encontrado una referencia:

Short circuit evaluation
Néxtor