2008-12-15 199 views
12

这里有一则有趣的,我的团队成员只是具有约稍微激烈的讨论代码...“如果”语句和结肠

Dim fred As Integer 

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

执行上面的代码片段后,有什么价值fred

尽量不要欺骗和调试代码。

这是一个非常有代表性的代码示例,最初作为使用冒号和If语句的示例,但随后有人决定自行提供fred的结果。

UPDATE: 我通常不会写这样的代码,这段代码只是一个例子。正如它发生的那样,这个问题源自于为我们的团队创建编码标准文档的讨论。

回答

16

我假设你的意思VB.Net。

根据VB语言规范的语法,你可以在这里阅读:

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

结果应该是 “6”。

这是因为一个 “行if语句的” 语法是:

If BooleanExpression Then Statements [ Else Statements ] StatementTerminator 

和 “声明” 被定义为

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

编辑: 我想指出调试代码不是“作弊”。

我曾经在微软的VB编译器团队工作。

有些时候规格不明确,或者与我们实际发货的产品不符。在其中几种情况下,解决方案(我们所做的修复)总是基于“编译器现在做什么”。

有时我们会改变编译器,有时我们会改变规范。

但是,我们总是会运行编译器,在我们做出决定之前查看它实际做了什么。

因此,调试代码是了解它的功能的重要组成部分...

+1

+1精通见解 – ComethTheNerd 2012-11-20 15:37:18

0

只是一个猜测

弗雷德= 6,因为你可以有一个冒号分隔在同一行多个语句。

不知道,如果“其他”是合法的(即编译)

恕我直言更好的编码风格应该选择:


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

我有一段时间没有广泛使用BASIC,所以这只是一个猜测,但我认为fred6

坦率地说,代码不是很可读。我觉得,由于不必在同一行的一切,并使用缩进代码将更具可读性:

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_somethingdo_other_thing执行时condition是真实的,但在现实中,总是执行do_other_thing

最好尽量遵守编码风格,使代码的意图更明显,更不含糊。

2

最终结果是6.
现在真正的问题是:您是如何进入我的回购?
:-)

0

在真正老的BASIC方言中,唯一可以遵循“THEN”的是一个行号。许多方言通过允许代码遵循“THEN”来改进;在解析过“THEN”后,如果指示的条件为假,他们将跳到下一行,否则继续现在的行。进一步的方言增加了直到行尾或“ELSE”(以先到者为准)的跳跃的能力;试图执行“ELSE”语句会跳到行尾。

当引入QuickBasic时,它添加了对多行if/then/else块的支持,但仍支持旧式方法。 Visual Basic紧随其后,vb.net继承了传统。