Un if realmente se lee cuando la condición es falsa?

Iniciado por z3nth10n, 28 Septiembre 2013, 21:12 PM

0 Miembros y 3 Visitantes están viendo este tema.

BlackM4ster

- Pásate por mi web -
https://codeisc.com

El Benjo

jajajajajajajajajajajajajaja Es que no debemos perder el tiempo, Frodo. XD

Bueno, aprovecho para comentar un mito que según sé es falso, pero quisiera saber si alguno de ustedes ha escuchado de él. Se dice que en las aplicaciones de VB.net cuando uno coloca un if de la forma:

Código (vbnet) [Seleccionar]

If A = True And B = True Then

End If


Aunque la primera evaluación sea falsa se hace la segunda evaluación y por ello es mejor realizar un if anidado.

Yo sigo creyendo que es un mito, pero qué dicen ustedes?
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

rir3760

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

.:UND3R:.

Hola soy del subforo de Ing. Inversa paso para intentar aclarar algunas cosas, es que creo que estás algo confundido.

Creo que la pregunta que quieres plantear:
¿Cómo se elabora un if y cómo este actúa?

En cuanto a la elaboración de las instrucciones, estas se realizan en tiempo de compilación o interpretación (dependiendo del lenguaje), creo que entre tus dudas y otros comentarios (que son del todo correcto), no van al tema. Es que ~ tiene toda la razón, pero el plantea la forma de elaboración en tiempo de compilación. Si quieres más detalles, deberías estudiar Teoría atómata y de compiladores, una ciencia en donde podrías crear tu propio lenguaje de programación (si es que entiendes la teoría que hay detrás de los compiladores).

Ahora la pregunta es cómo el IF actúa, la estructura del if depende netamente del compilador, pero la comparación generalmente llega a una comparación CMP (instrucción de lenguaje ensamblador).

if (var_a == true) {
return 0;
}
.....
....
..


Esto en lenguaje ensamblador sería más menos así (reitero esto depende del compilador):

Código (asm) [Seleccionar]
mov eax, dword ptr:[40381200] ; mueve el contenido de una dirección de memoria a la variable eax
cmp eax,1 ; compara si eax (variable cual posee el contenido de var_a) es 1.
jne continuar ; si no se cumple se dirigirá al label o etiqueta continuar.
retn ; retorna a la dirección apuntada al principio del stack o pila
continuar:
......
....
..


Espero que se entienda más menos

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

ABDERRAMAH

Cita de: El Benjo en  4 Octubre 2013, 02:04 AM
jajajajajajajajajajajajajaja Es que no debemos perder el tiempo, Frodo. XD

Bueno, aprovecho para comentar un mito que según sé es falso, pero quisiera saber si alguno de ustedes ha escuchado de él. Se dice que en las aplicaciones de VB.net cuando uno coloca un if de la forma:

Código (vbnet) [Seleccionar]

If A = True And B = True Then

End If


Aunque la primera evaluación sea falsa se hace la segunda evaluación y por ello es mejor realizar un if anidado.

Yo sigo creyendo que es un mito, pero qué dicen ustedes?

pues te respondo co toda seguuridad, se comprueban las dos condiciones, y estoy tan seguro por la existencia de los operadores andalso y orelse, que sirven para ignorar las demas condiciones si la sentencia no puede ser verdadera

Eleкtro

#15
Cita de: El Benjo en  4 Octubre 2013, 02:04 AMAunque la primera evaluación sea falsa se hace la segunda evaluación y por ello es mejor realizar un if anidado.

En lugar de anidar podemos servirnos del resto de operadores del lenguaje (los que ya ha nombrado ABDERRAMAH),
solo es necesario leer la referencia de los operadores de VBNET para entender como funcionan y saber las expresiones que se evaluan y las que no...

-> Logical/Bitwise Operators (Visual Basic)

Saludos!








ivancea96

Hablando de C++:

En un IF con varias condiciones unidas por un AND (Ejemplo: "if(1 && 0);"), se leen en orden, y en el momento en que una sea falsa, acaba con el IF. Esto lo podemos ver fácilmente (¬¬ vagos) con un código como este:

Código (cpp) [Seleccionar]
#include <iostream>
bool asd(){
std::cout << "Hola";
return false;
}
int main () {
if(2==0 && asd());
system("pause>nul");
}


Compilado con MinGW*

Haced la prueba en VB, y los lenguajes que uséis, y así tenemos este hilo para saber que lenguajes leen todas las condiciones xD

Respecto a la pregunta original, Ikillnukes, el compilador lo que hace es compilar, no averiguar si las condiciones (excepto las del tipo "#if") son o no son verdaderas.

~

Cita de: El Benjo en  4 Octubre 2013, 02:04 AM
jajajajajajajajajajajajajaja Es que no debemos perder el tiempo, Frodo. XD

Bueno, aprovecho para comentar un mito que según sé es falso, pero quisiera saber si alguno de ustedes ha escuchado de él. Se dice que en las aplicaciones de VB.net cuando uno coloca un if de la forma:

Código (vbnet) [Seleccionar]

If A = True And B = True Then

End If


Aunque la primera evaluación sea falsa se hace la segunda evaluación y por ello es mejor realizar un if anidado.

Yo sigo creyendo que es un mito, pero qué dicen ustedes?

No es cierto. Un código compilado que ejecutara todo el IF aunque este ya no cumpla una condición requerida sería extremadamente ineficiente. De hecho no es tan difícil programar a mano este tipo de optimización, y es más breve y hasta claro.

Por ejemplo para el código anterior sería más eficiente compilarlo así:
1. comparar A==TRUE
2. si es FALSE, terminar el IF en 6 (y no se ejecuta la siguiente condición)
3. comparar B==TRUE
4. si es FALSE, terminar el IF en 6

5. { Código dentro del IF }

6. terminar el IF



Que compilarlo así:
1. comparar A==TRUE
2. si es TRUE, seguir comparando en 3 (un salto inmediato poco inteligente)
3. comparar B==TRUE
4. si es TRUE, entrar en el IF en 6
5. ir a terminar el IF en 7

6 { Código dentro del IF }

7. terminar el IF



Son más comprobaciones ejecutadas sin razón cuando se sabe que si se usa AND y no se cumple no hay caso de seguir ejecutando, y requiere un salto incondicional como terminador del IF (en el segundo caso, que es más ineficiente). Y si el IF fuera mucho más complejo, la ejecución sería menos que óptima, y eso no sería aceptable en aplicaciones de grado industrial que tienen elementos mucho más complejos que esto.



Cita de: ivancea96 en  4 Octubre 2013, 17:04 PM
Hablando de C++:

En un IF con varias condiciones unidas por un AND (Ejemplo: "if(1 && 0);"), se leen en orden, y en el momento en que una sea falsa, acaba con el IF. Esto lo podemos ver fácilmente (¬¬ vagos) con un código como este:

Código (cpp) [Seleccionar]
#include <iostream>
bool asd(){
std::cout << "Hola";
return false;
}
int main () {
if(2==0 && asd());
system("pause>nul");
}


Compilado con MinGW*

Haced la prueba en VB, y los lenguajes que uséis, y así tenemos este hilo para saber que lenguajes leen todas las condiciones xD

Respecto a la pregunta original, Ikillnukes, el compilador lo que hace es compilar, no averiguar si las condiciones (excepto las del tipo "#if") son o no son verdaderas.
Eso depende de la comprobación y de la forma en la que se optimiza el código. Si por ejemplo hay valores constantes que siempre van a evaluar a verdadero o a falso, el compilador haría bien en eliminarlos, entre otras optimizaciones más complejas. Tener que comprobar todas las condiciones determinables en tiempo de compilación debería ser una optimización básica. También es necesario realizar otras comprobaciones para las demás optimizaciones y para eso se necesita algún nivel de evaluación del IF (el simple hecho de tener que compilarlo requiere eso).
Sitio web (si la siguiente imagen no aparece es porque está offline):

Juan.

En VB no lo puedo confirmar, lo odio y no pienso probar nada, pero en C# si se evalua false el primero el otro no se realiza


public static Boolean a() {
    Console.WriteLine("Entro en A");
    return false;
}

public static Boolean b() {
    Console.WriteLine("Entro en B");
    return false;
}

private static void Main() {
    if (Program.a() && Program.b()) {
                Console.WriteLine("Entro");
        }
}


Este código solo imprime entro en a, nada de lo demás

ABDERRAMAH

¿C# no dispone del equivalente a andalso y orelse?