SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: NEXTOR en Sábado 8 de Mayo de 2004, 01:41
-
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:
if(a!=0 && 10/a<1){
...
}
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:
if(a==0 || 10/a>=1){
...
}
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.
-
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.
-
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
-
¡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.
-
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.
-
Gracias por precisarlo.
Un saludo.
Ruben3d
-
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)
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
-
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
-
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 (http://www.cs.umbc.edu/www/undergraduate/courses/CMSC201/spring97/lectures/lec07/short.shtml)