【问题标题】:c++ cannot appear in a constant-expression| [duplicate]c++ 不能出现在常量表达式中| [复制]
【发布时间】:2012-11-13 02:04:13
【问题描述】:

可能重复:
How do I select a range of values in a switch statement?

我遇到了一些错误,我已经搜索了一段时间,但我不知道错误的原因是什么。 (我对编程很陌生。)

这是我遇到的错误:

error: 'Essais' cannot appear in a constant-expression| (line 200)
warning: overflow in implicit constant conversion| (line 202)

我有case和cote:

  char AfficherCote (int Essais)
 {
 char Cote;
 switch (Essais)
  {
(line200)       case Essais<=20:
    {
(line 202)           Cote='Excellent';

        return (Cote);
        break;
    }
    case Essais<=40:
    {
        Cote='Très bon';
        return (Cote);
        break;
    }
    case Essais<=60:
    {
        Cote='Bon';
        return (Cote);
        break;
    }
    case Essais<=80:
    {
        Cote='Moyen';
        return (Cote);
        break;
    }
    case Essais<=100:
    {
        Cote='Muvais';
        return (Cote);
        break;
    }
    case Essais>=100:
    {
        Cote='Très mauvais';
        return (Cote);
    }
  }
}

【问题讨论】:

标签: c++


【解决方案1】:

switch-case 仅适用于常量值(*)(例如 3'a'),不适用于范围(例如 &lt;=100)。您也不能在case 语句中包含变量名。正确的语法如下:

switch (Essais)
{
case 1:
   /* ... */
  break;
case 2:
   /* ... */
   break;
default:
   /* ... */
}

如果您需要范围测试,请使用if 而不是switch-case

if (Essais <= 80)
  return "Cote";
else if (Essais <= 100)
  return "Muvais";

另请注意,不能将单引号 ' 用于字符串。请改用双引号",并使用std::string(不是char)类型的变量来存储字符串。


(*) 准确地说,case 语句中给出的条件必须是整数类型、枚举类型或类类型的常量表达式 >convertible 为整数或枚举类型(有关详细信息,请参阅 C++ 标准的第 6.4.2/2 节)。

【讨论】:

  • 感谢您的帮助,工作正常
【解决方案2】:

switch 块不是这样工作的。你需要这样做:

switch (Essais) {
    case 20:
        ...
    case 40:
        ...
    case 60:
        ...
    /* etc, etc */
}

每个caseswitch 语句中的值与特定的常量值进行比较。如果它们相等,则执行该块。在您的代码中,编译器会抱怨,因为像 Essais&lt;=20 这样的表达式不是可以在编译时计算的常量。

鉴于您正在尝试做的事情,if ... else if ... else 链会更合适。 switch 块只能针对特定值进行测试,并且无法处理测试范围,这似乎是您正在尝试做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多