代码之家  ›  专栏  ›  技术社区  ›  Mutating Algorithm

在C中运行时计算开关表达式[重复]

  •  1
  • Mutating Algorithm  · 技术社区  · 7 年前

    我想从控制台读取字符并检查它是否是字母数字。据我所知, isalnum 具有以下函数签名。

    int isalnum(int x);

    为什么写作是违法的

    switch(input) { case isalnum(input): ...

    如果 板蓝根 返回整数值。

    5 回复  |  直到 7 年前
        1
  •  4
  •   David Ranieri    7 年前

    https://en.cppreference.com/w/c/language/switch

    语法要求

    案例 常数表达式 : 陈述

    具有

    常数表达式 -转换和整数提升后与条件类型相同类型的常量表达式

    也就是说,语法需要常量表达式。
    函数调用的结果不是常量表达式。
    这就是为什么它是非法的。

        2
  •  2
  •   emsimpson92    7 年前

    在你的案件陈述中你不能叫伊莎尔纳姆。试试这样的:

    switch(isalnum(input))
    {
      case 0:
        //do stuff
        break;
      default:
        //do other stuff
        break;
    }
    
        3
  •  2
  •   John Bollinger    7 年前

    其他的答案解释了C语法的要求,特别是 case 值必须是常量表达式。我只想补充一下,您提供的示例代码是 语义上 也有缺陷。

    你写道:

    switch(input) {
        case isalnum(input):
            ...
    

    一个 switch 语句比较开关表达式-- input ,在本例中--每个 案例 表达式,以搜索匹配项。但是 isalnum() 返回 未指定 参数为字母数字时为非零数,否则为零。没有理由期待 input == isalnum(input) 输入 实际上是字母数字的(尽管它可能是字母数字的),但是您可以确定这种关系 坚持论点 0 .

    因此,即使C允许,这种特定的方法也是不正确的 案例 表达式为非常量。

        4
  •  1
  •   jplc    7 年前

    转换 语句将程序的控制流传输到 案例 上市的。这就是为什么你需要给 案例 . 它们在编译时进行评估。

        5
  •  0
  •   Christian Gibbons    7 年前

    如果目的是使用switch case语句,那么可以 isalnum 每个字母数字字符都有一堆大小写,然后是默认大小写。类似于:

    switch(input)
    {
        case '0':
        case '1':
        case '2':
    

    [...]

        case 'z':
            // do something here
            break;
        default:
            // do something else here
            break;
    }