2008-12-15 6 views
12

Voici un article intéressant de code mes collègues membres de l'équipe ont été juste avoir une discussion un peu houleux sur ...« Si » déclaration et le côlon

Dim fred As Integer 

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

Après l'exécution de l'extrait de code ci-dessus, quelle est la valeur de fred? Essayez de ne pas tricher et de déboguer le code. Ceci est un exemple de code fortement artificiel qui a commencé comme exemple d'utilisation du deux-points avec une instruction If, mais quelqu'un a décidé de prendre sur lui de fournir un résultat pour fred.

MISE À JOUR: Normalement, je n'écrirais pas de code comme celui-ci et cet extrait ne sert que d'exemple. Comme il se trouve, cette question est née d'une discussion impliquant la création d'un document de normes de codage pour notre équipe.

Répondre

16

Je suppose que vous voulez dire VB.Net.

Selon la grammaire dans la spécification du langage VB, que vous pouvez lire ici:

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

Le résultat devrait être "6".

En effet, la grammaire pour une "ligne instruction if" est:

If BooleanExpression Then Statements [ Else Statements ] StatementTerminator 

et "déclarations" est définie comme

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

Edit: Je voudrais noter que déboguer le code n'est pas "tricher".

J'avais l'habitude de travailler sur l'équipe de compilateur VB chez Microsoft.

Il y avait des moments où la spécification était ambiguë, ou ne correspondait pas à ce que nous avions réellement livré. Dans plusieurs de ces cas, la solution (ce que nous avons fait pour le réparer) était toujours basée sur "bien ... que fait le compilateur maintenant".

Parfois nous changerions le compilateur, parfois nous changerions la spécification. Cependant, nous exécuterions toujours le compilateur pour voir ce qu'il faisait réellement avant de prendre une décision. Alors ... déboguer le code est une grande partie de comprendre ce qu'il fait ...

+1

+1 Brilliant insight – ComethTheNerd

+0

"débogage" -> "débogage". "VB.Net" -> "VB.NET" (ref http://en.wikipedia.org/wiki/Visual_Basic_.NET) –

+0

Pour clarifier, l'opérateur du côlon vous permet simplement de combiner plusieurs instructions sur une ligne, ce qui revient à exécuter les instructions sur des lignes successives. –

0

Juste une supposition

fred = 6 parce que vous pouvez avoir plusieurs instructions sur la même ligne séparés par deux points.

Je ne sais pas si le "autre" est légal (à savoir compilable)

à mon humble avis un meilleur style de codage doit être choisi:


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

Je n'ai pas beaucoup utilisé BASIC depuis un moment, donc c'est juste une supposition, mais je pense que fred est 6. Franchement, le code n'est pas très lisible. Je pense que de ne pas avoir tout en une ligne et en utilisant le code indentation serait plus lisible:

Dim fred As Integer 

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

Je crois que le code est équivalent, si je ne me trompe pas. Mais, si le code n'est pas équivalent, cela amène un autre point: Le code original est "compliqué" de sorte que ce qu'il semble dire n'est pas vraiment ce qui se passe réellement. Similaire au piège dans les langues de style C:

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

Le code semble dire implique que do_something et do_other_thing est exécuté lorsque le condition est vrai, mais en réalité, do_other_thing est toujours exécutée.

Il est préférable d'essayer d'adhérer à des styles de codage qui rendent l'intention du code plus évidente et moins ambigüe.

2

Le résultat final est 6.
Maintenant, la vraie question est: Comment êtes-vous entré dans mon repo?
:-)

0

Dans les anciens dialectes BASIC, la seule chose qui pouvait suivre un "THEN" était un numéro de ligne. Beaucoup de dialectes ont amélioré cela en permettant au code de suivre le "THEN"; après avoir analysé le "THEN", ils passeraient à la ligne suivante si la condition indiquée était fausse, ou continueraient avec la ligne actuelle. D'autres dialectes ont ajouté la possibilité de sauter jusqu'à la fin de la ligne ou "ELSE", selon la première éventualité; tenter d'exécuter une instruction "ELSE" passerait à la fin de la ligne. Lorsque QuickBasic a été introduit, il a ajouté la prise en charge des blocs if/then/else multi-lignes, mais a conservé le support de l'ancienne approche. Visual Basic a suivi, et vb.net continue la tradition.

Questions connexes