题
下面是我的团队成员只是具有约稍微激烈的讨论一则有趣的代码......
Dim fred As Integer
If True Then fred = 5 : fred = 3 : fred = 6 Else fred = 4 : fred = 2 : fred = 1
执行上面的代码段之后,什么是的值的 fred的
尽量不要欺骗和调试代码。
这是开始了作为使用结肠与If语句的一个例子,但后来有人决定采取它在他们自己毫无顾忌对于结果的高度做作代码示例 fred的
<强>更新强>: 通常我不会写这样的代码和这个片段只是作为一个例子。由于恰巧,这个问题源于涉及编码标准文档的创建对于我们团队的讨论。
解决方案
我假设你的意思是VB.Net。
据VB语言规范的语法,你可以在这里阅读:
结果应该是 “6”。
这是因为对于一个“行if语句”的语法是:
If BooleanExpression Then Statements [ Else Statements ] StatementTerminator
和 “语句” 被定义为
Statements ::=
[ Statement ] |
Statements : [ Statement ]
修改强> 我想指出,调试代码不被“欺骗”。
我曾经在微软的VB编译器团队的工作。
有几次在规范含糊不清,或不符合我们实际上已经发货。在一些这些案件的解决方案(我们所做的事情来解决它)总是基于“嗯......什么呢,现在的编译器做的。”
有时我们将改变编译器,有时我们将改变规格。
不过,我们会一直运行编译器,看之前,我们做了一个决定,它实际上没有。
所以...调试代码就是要弄清楚它做什么...
的重要组成部分其他提示
我没有使用BASIC是广泛一段时间,所以这只是一种猜测,但我认为这是fred
6
。
坦率地说,代码不是很可读。我认为通过不必在一个行的一切,使用压痕的代码会更可读:
Dim fred As Integer
If True Then
fred = 5
fred = 3
fred = 6
Else
fred = 4
fred = 2
fred = 1
End If
笔者认为是等效的代码,如果我没有弄错。
但是,如果代码是不等价的,这带来了另一个问题:原代码的方式“棘手”的是什么,似乎是说是不太究竟发生什么事。类似于在C语言风格的语言陷阱:
if (condition)
do_something();
do_other_thing();
中的代码似乎在说暗示do_something
和do_other_thing
执行时condition
是真实的,但在现实中,始终执行do_other_thing
。
最好是尽量坚持编码风格,这使得代码更明显少ambigious的意向。
最终的结果是6,点击 现在真正的问题是:你是怎么进入我的回购结果? : - )
只是一个猜测
佛瑞德= 6,因为你可以对用冒号隔开同一行多个语句。
不知道,如果“其他”是合法的(即,可编译)
IMHO更好的编码风格应选择:
if (condition) then
statement
statement
else
statement
statement
end if
在真的老了BASIC方言,这可能会遵循“然后”的唯一事情是行号。许多方言允许代码遵循“THEN”在此提高;解析过去后,“然后”他们会跳至下一行,如果指定的条件为假,否则继续本线。进一步加入方言跳过直到任何一端的行或“ELSE”先到者为准的能力;试图执行一个“ELSE”语句将跳到结束线。
当的QuickBasic被引入,它增加了对多行的if / then / else块,但保持在对于旧式的方法的支持。 Visual Basic中如法炮制,和vb.net延续了传统。