12

这是一段有趣的代码,我的团队成员刚刚就...

  Dim fred As Integer

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

执行上述代码片段后,fred的值是多少?

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

这是一个高度人为的代码示例,最初是作为使用冒号和 If 语句的示例,但后来有人决定自己为fred提供结果。

更新:我通常不会写这样的代码,这个片段只是作为一个例子。碰巧,这个问题源于一次涉及为我们团队创建编码标准文档的讨论。

4

5 回答 5

16

我假设你的意思是 VB.Net。

根据 VB 语言规范中的语法,您可以在此处阅读:

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

结果应该是“6”。

这是因为“line if 语句”的语法是:

If  BooleanExpression  Then  Statements  [  Else  Statements  ]  StatementTerminator

并且“语句”被定义为

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

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

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

有时规格不明确,或者与我们实际发货的不匹配。在其中一些情况下,解决方案(我们为修复它所做的工作)总是基于“嗯......编译器现在做什么”。

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

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

所以......调试代码是弄清楚它的作用的重要组成部分......

于 2008-12-15T02:25:46.523 回答
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_something并且do_other_thingcondition为真时执行,但实际上do_other_thing总是执行。

最好尝试遵守编码风格,使代码的意图更明显,不那么模棱两可。

于 2008-12-15T02:25:50.800 回答
2

最终结果是 6。
现在真正的问题是:你是如何进入我的 repo 的?
:-)

于 2008-12-15T04:39:42.587 回答
0

只是猜测

fred = 6,因为您可以在同一行上使用冒号分隔多个语句。

不确定“else”是否合法(即可编译)

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


if (condition) then
  statement
  statement
else
  statement
  statement
end if
于 2008-12-15T02:23:23.847 回答
0

在真正古老的 BASIC 方言中,唯一可以跟在“THEN”后面的是行号。许多方言通过允许代码跟随“THEN”来改进这一点;在解析过去“THEN”之后,如果指示的条件为假,他们将跳到下一行,否则继续当前行。其他方言增加了跳过直到行尾或“ELSE”的能力,以先到者为准;尝试执行“ELSE”语句会跳到行尾。

引入 QuickBasic 后,它增加了对多行 if/then/else 块的支持,但保留了对旧式方法的支持。Visual Basic 紧随其后,而 vb.net 则延续了这一传统。

于 2011-03-04T21:18:54.740 回答