【问题标题】:Switch statement always resolves to default instead of caseSwitch 语句总是解析为默认值而不是大小写
【发布时间】:2012-08-01 00:16:50
【问题描述】:

所以我最近一直在尝试 D,因为我认识的许多程序员都建议我通过 C++ 学习它。

我正在使用 DMD Compiler v2.057,这是我的代码:

while(cliLoopC)
{
    write("?> ");
    string iPt_ = std.string.tolower(readln());
    switch (iPt_)
    {
        default: writeln(E_URECCOM); break;
        case "test":
            writeln("Hello!");
            break;
    }
}

程序是,每当我输入test,所以它应该转到case而不是default,它只打印E_URECCOM的内容(这是一个包含@的常量char [] 987654325@)。

我不知道发生了什么让它这样做。有什么想法吗?

【问题讨论】:

  • Switch 语句总是输入第一个可能的匹配项,然后继续遍历其他 case 标签,直到找到中断或结束。这就是为什么默认应该结束。
  • @RedX 刚刚测试过,默认情况下并非如此(至少在 DMD 的情况下)。不过,常规 case 块确实如此(也经过测试)。默认值可以去任何地方,但它是惯例(在我看来,这是有充分理由的)将它放在底部。
  • 这看起来很傻。不可能是这样的......无论如何,在顶部看到default 是相当误导的。

标签: switch-statement d evaluate


【解决方案1】:

是的,在 readln 的末尾有一个 \n。尝试使用std.string.strip(readln());

【讨论】:

    【解决方案2】:

    嗯...我还没有尝试过D,但也许readln()在字符串末尾包含了CR、LF或CR/LF,它应该包含在比较字符串中?

    案例“测试\n”:

    ?

    【讨论】:

      【解决方案3】:

      编辑: Adam D. Ruppe的答案是正确的答案:

      是的,在 readln 的末尾有一个 \n。尝试使用 std.string.strip(readln());

      我只是想把它扔在那里,因为我的答案仍然有支票

      我的回答: 默认情况是全部情况,所以最后看起来最好(并且是常规的)

      喜欢这个

      while(cliLoopC)
      {
          write("?> ");
          string iPt_ = std.string.tolower(readln());
          switch (iPt_)
          {
              case "test":
                  writeln("Hello!");
                  break;
              default: writeln(E_URECCOM); break;
          }
      }
      

      【讨论】:

      • 我有理由确定这是错误的。文档中的一个例子甚至与这个答案相矛盾:dlang.org/statement.html#SwitchStatement
      • 请注意,以这种方式使用时不会中断。在文档中,他们希望它每次都被击中,然后继续处理其他情况
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      相关资源
      最近更新 更多