代码之家  ›  专栏  ›  技术社区  ›  BlackMael

“If”语句和冒号

  •  12
  • BlackMael  · 技术社区  · 17 年前

    这是一段有趣的代码,我的团队成员刚刚对此进行了稍微激烈的讨论。..

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

    执行上述代码片段后 男子名 ?

    尽量不要作弊和调试代码。

    这是一个高度人为的代码示例,最初是一个使用冒号和If语句的示例,但后来有人决定自己承担这个任务,为 男子名 .

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

    5 回复  |  直到 3 年前
        1
  •  16
  •   SSS    9 年前

    我猜你是说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编译器团队工作。

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

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

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

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

        2
  •  3
  •   coobird    17 年前

    我已经有一段时间没有广泛使用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 这是真的,但实际上, 做其他事情 总是被执行。

    最好尽量坚持编码风格,使代码的意图更加明显,不那么具有歧义。

        3
  •  2
  •   Pat Hermens    17 年前

    最终结果是6。
    现在真正的问题是:你是怎么进入我的回购的?
    :-)

        4
  •  0
  •   user21826    17 年前

    只是猜测

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

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

    依我之见,应该选择更好的编码风格:

    
    if (condition) then
      statement
      statement
    else
      statement
      statement
    end if
    
        5
  •  0
  •   supercat    15 年前

    在非常古老的BASIC方言中,唯一能跟在“THEN”后面的是行号。许多方言对此进行了改进,允许代码遵循“THEN”;在解析完“THEN”之后,如果指示的条件为false,它们将跳到下一行,否则将继续当前行。其他方言增加了跳过到行尾或“ELSE”的能力,以先到者为准;尝试执行“ELSE”语句将跳到行尾。

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