2008-12-15 14 views
12

Aquí es una interesante pieza de código que mis compañeros de equipo simplemente tuvieron una discusión acerca calienta ligeramente ...'if' y el colon

Dim fred As Integer 

    If True Then fred = 5 : fred = 3 : fred = 6 Else fred = 4 : fred = 2 : fred = 1 

Después de ejecutar el código anterior, ¿cuál es la valor de fred?

Trate de no engañar y depurar el código.

Este es un ejemplo de código muy artificial que comenzó como un ejemplo del uso de los dos puntos con una instrucción If, pero luego alguien decidió tomar la iniciativa de ofrecer un resultado para fred.

ACTUALIZACIÓN: Normalmente, no escribiría código como este y este fragmento solo sirve como ejemplo. Como sucede, esta pregunta se originó en una discusión que involucró la creación de un documento de estándares de codificación para nuestro equipo.

Respuesta

16

Asumo que quiere decir VB.Net.

De acuerdo con la gramática en la especificación VB El lenguaje, que se puede leer aquí:

http://www.microsoft.com/Downloads/thankyou.aspx?familyId=39de1dd0-f775-40bf-a191-09f5a95ef500&displayLang=en

El resultado debe ser "6".

Esto se debe a la gramática de una "línea de sentencia if" es:

If BooleanExpression Then Statements [ Else Statements ] StatementTerminator 

y "declaraciones" se define como

Statements ::= 
[ Statement ] | 
Statements : [ Statement ] 

Editar: me gustaría tener en cuenta esa depuración del código no es "trampa".

Solía ​​trabajar en el equipo de compiladores de VB en Microsoft.

Hubo momentos en los que la especificación era ambigua o no coincidía con lo que habíamos enviado realmente. En varios de esos casos, la solución (lo que hicimos para solucionarlo) siempre se basaba en "bueno ... ¿qué hace el compilador ahora?".

A veces cambiamos el compilador, a veces cambiamos las especificaciones.

Sin embargo, siempre ejecutamos el compilador para ver lo que realmente hacía antes de tomar una decisión.

Así que ... depurar el código es una gran parte de averiguar qué hace ...

+1

1 brillante idea – ComethTheNerd

+0

"debuging" -> ". Depuración "VB.Net" -> " VB.NET"(Ref. Http://en.wikipedia.org/wiki/Visual_Basic_.NET) Para –

+0

aclare, el operador de dos puntos simplemente le permite combinar múltiples declaraciones en una línea. Es lo mismo que ejecutar las declaraciones en líneas sucesivas. –

0

Sólo una conjetura

Fred = 6, ya que puede tener múltiples declaraciones en la misma línea separados por dos puntos.

No estoy seguro si el "otro" es legal (es decir compilables)

mi humilde opinión un estilo de codificación debe ser elegido mejor:


if (condition) then 
    statement 
    statement 
else 
    statement 
    statement 
end if 
3

No he utilizado ampliamente BASIC que desde hace tiempo, así que esto es sólo una suposición, pero creo que es fred6.

Francamente, el código no es muy legible. Siento que al no tener todo en una sola línea y el uso de la sangría del código sería más legible:

Dim fred As Integer 

If True Then 
    fred = 5 
    fred = 3 
    fred = 6 
Else 
    fred = 4 
    fred = 2 
    fred = 1 
End If 

Creo que es código equivalente, si no me equivoco.

Pero, si el código no es equivalente, eso trae a colación otro punto: el código original es "complicado" de una manera que lo que parece estar diciendo no es exactamente lo que realmente está sucediendo. De manera similar a la trampa en lenguajes de tipo C:

if (condition) 
    do_something(); 
    do_other_thing(); 

El código parece decir implica que se ejecuta do_somethingdo_other_thing y cuando el condition es cierto, pero en realidad, do_other_thing siempre se ejecuta.

Lo mejor es intentar adherirse a los estilos de codificación que hacen que la intención del código sea más obvia y menos ambigua.

2

El resultado final es 6.
Ahora la verdadera pregunta es: ¿Cómo entraste en mi repositorio?
:-)

0

En dialectos BASIC realmente antiguos, lo único que podría seguir a "THEN" era un número de línea. Muchos dialectos mejoraron al permitir que el código siguiera el "ENTONCES"; después de analizar más allá del "ENTONCES" saltaban a la siguiente línea si la condición indicada era falsa, o si no continúan con la línea actual. Otros dialectos agregaron la capacidad de omitir hasta el final de la línea o "ELSE", lo que ocurriera primero; intentar ejecutar una instrucción "ELSE" saltaría al final de línea.

Cuando se introdujo QuickBasic, se agregó soporte para bloques multilínea if/then/else, pero se mantuvo el soporte para el enfoque antiguo. Visual Basic hizo lo mismo y vb.net continúa con la tradición.

Cuestiones relacionadas