Hola chicos, bueno a raíz de una
discusión con la profesora de programación he investigado sobre los
Ifs de vb6...
En esta situación:
If A = True Or B = False Then
Lo lógico sería que al leer
A=True no comprobara Lo siguiente puesto que la condición se cumpliría de todas formas.
Pero no, vb te comprueba
TODO el
If pase lo que pase
en todos los casos.
Aquí un código que lo demuestra:
Option Explicit
Private Function OrTest(ByVal bReturn As Boolean) As Boolean
'// Imprimo un texto para saber que he pasado por la función.
Debug.Print Time$, "Función con el argumento " & bReturn & " llamada."
OrTest = bReturn
End Function
Private Sub Form_Load()
'// Aquí lo logico sería comprobar las dos ya que
'// si la primera no es true, lo puede ser la segunda.
If OrTest(False) Or OrTest(False) Then
'// Nothing
End If
Debug.Print String$(75, "=")
'// Lo lógico sería que se saltase la segunda función puesto
'// que la primera es true, pero no, nuestro querido vb
'// comprueba igual...
If OrTest(True) Or OrTest(False) Then
'// Nothing
End If
End Sub
Retorno:
00:27:48 Función con el argumento Falso llamada.
00:27:48 Función con el argumento Falso llamada.
===========================================================================
00:27:48 Función con el argumento Verdadero llamada.
00:27:48 Función con el argumento Falso llamada.
Sé que alguno dirá:
¿y a mí qué más me da si el resultado es el mismo?Bueno, pues imagina que tienes un
If tal que así:
If Calculo(1) Or Calculo(2) Or Calculo(3) Or Calculo(4) Or Calculo(5) Then
'...
End If
La función
Calculo() es un algoritmo complejo y tarda 1 segundo de media.
Si fuera otro lenguaje de programación si
Calculo(1) es
true se saltaría los demás, pero nuestro querido vb6
llamará a todas las demás funciones perdiendo tiempo innecesariamente...
Pasando de 1 seg a 5 en este caso.
La alternativa que propongo en estos casos es
(no son agradables a la vista, aviso ) :
Sustituir esto:
If A(324) = 45 Or B(12) = 2 Or B(4563) = 56 Then
Call DoIt
End If
Por esto:
If A(324) = 45 Then
Call DoIt
ElseIf B(12)=2 Then
Call DoIt
ElseIf B(4563) = 56 Then
Call DoIt
End If
Esto:
If A(324) = 45 And B(12) = 2 And B(4563) = 56 Then
'...
End If
Por esto:
If A(324) = 45 Then
If B(12) = 2 Then
If B(4563) = 56 Then
'...
End If
End If
End If
Con esto no quiero decir que lo hagáis así de normal, sólo cuando necesitemos velocidad.
Hice estas pruebas a ver si algún lenguaje más era tonto, pero por ahora sólo es vb6.
Si alguien sabe de otro hacedmelo saber, me interesa mucho.
Dedico este articulo a
Karcrack, BlackZero, TheSwash y raul338 por orientarme y ayudarme con los test.
VB.NET tiene una expresion para evitar esto:
Short-Circuiting Logical Operations http://msdn.microsoft.com/en-us/library/wz3k228a.aspx
Más info:
http://en.wikipedia.org/wiki/Short-circuit_evaluation
Espero que al menos a alguien le sirva todo esto.
DoEvents!