【问题标题】:Why an error when ORing switch case values?为什么在 ORing switch case 值时会出错?
【发布时间】:2019-12-20 23:48:56
【问题描述】:
 switch (ch)
    {
    case '~' || 177: 
        tile->tileType = TILE_NONE;
        return true;
    case '@' || 219: //error here: '@'
        tile->tileType = TILE_WALL;
        return true; 
    }

错误内容如下: "case 值 '1' 已使用"

.....什么鬼??

我已尝试清理解决方案,重新启动,使用另一台 PC。我“非常接近”重新安装VS。知道发生了什么吗?

【问题讨论】:

  • C 是一种相当简单的文字语言。如果您阅读了 || 操作员的工作,那么它应该能够阐明情况。
  • 您认为重新安装 VS 会如何修复代码中的错误?相信编译器。当它说你的代码错了,那肯定是错的。
  • @abelenky 重新安装 VS 超出范围,但重新启动 PC 不是吗?计算机已经很好地训练了 Xolin_,尽可能地降低了他们的期望。
  • 下一个问题你会问为什么你的 char 永远不会 219...

标签: c visual-studio visual-studio-2019


【解决方案1】:

你不能有多个 case 除以||,就像你使用 if 语句一样。你有案子

'~' || 177:

这是一个计算结果为 true 的布尔表达式 which gets evaluated to 1,因为 case 只能是整数类型(intcharenum),因此必须将其转换为 int。所以你说的是真的

case 1:

同样的事情发生在你的第二个 case 语句中,它被评估为第二个 case 1:,因此出现错误

改为:

case '~':
case 117:
   //code

【讨论】:

    【解决方案2】:

    不要使用逻辑 OR 表达式,而是使用切换失败行为:

    switch (ch)
    {
       case '~':
       case 117:
          tile->tileType = TILE_NONE;
          return true;
       case '@':
       case 219:
          tile->tileType = TILE_WALL;
          return true;
    }
    

    【讨论】:

      【解决方案3】:

      '~' || 177 的计算结果为 true,即 1
      所以case '~' || 177:这行真的是case 1:

      case '@' || 219: 行中的'@' || 219 相同

      你不能拥有

      switch (ch)
      {
      case 1: 
          tile->tileType = TILE_NONE;
          return true;
      case 1: //  "case value '1' already used"  (You used it just above!)
          tile->tileType = TILE_WALL;
          return true; 
      }
      

      错误信息完美而准确。
      为什么您认为应该重新启动 PC 或重新安装 IDE 工具?

      【讨论】:

        【解决方案4】:

        || 运算符只是检查两边的表达式是否不等于 0,如果其中任何一个不等于 0,则生成一个真值 1,所以第一种情况是:

        switch(...) {
        case 1:
        

        第二种情况也是:

        case 1:
        

        因此,编译器无法决定遵循哪个case

        您的意思(和想要做的)可能是另一件事:

        switch (ch)
            {
            case '~': case 177: /* ch is either '~' or 177 */
                tile->tileType = TILE_NONE;
                return true;
            case '@': case 219: /* ch is either '@' or 219 */
                tile->tileType = TILE_WALL;
                return true; 
            }
        

        这意味着如果ch'~'177 中的任何一个,则执行第一部分,当它是'@'219 时,则转到上述代码的第二部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-17
          • 2018-03-23
          • 1970-01-01
          • 2021-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多