在C中运行时评估开关表达式

时间:2018-07-31 19:46:41

标签: c switch-statement

我想从控制台读取字符,并检查它是否为字母数字。据我了解,isalnum具有以下功能签名。

int isalnum(int x);

为什么写非法

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

如果isalnum返回一个整数值。

5 个答案:

答案 0 :(得分:4)

请参见https://en.cppreference.com/w/c/language/switch

语法要求

  

案例 constant_expression 声明

使用

  

constant_expression -与转化和积分提升后的条件类型相同的常量表达式

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

答案 1 :(得分:2)

您不能在case语句中调用isalnum。尝试这样的事情:

switch(isalnum(input))
{
  case 0:
    //do stuff
    break;
  default:
    //do other stuff
    break;
}

答案 2 :(得分:2)

其他答案已经解释了C语法的要求,特别是每个case值需要是一个常量表达式。我只想补充一下,您提供的示例代码在看来也有缺陷

您写道:

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

一条switch语句将切换表达式(在这种情况下为input与每个case表达式进行比较,以查找匹配项。但是isalnum()的自变量为字母数字时返回 unspecified 非零数字,否则返回零。当input == isalnum(input)实际上是字母数字(尽管可能是字母数字)时,没有理由指望input是正确的,而您可以肯定的是 成立0的参数。

因此,即使C允许case表达式为非恒定表达式,这种特定方法也不正确。

答案 3 :(得分:1)

switch 语句将程序的控制流转移到列出的 case 之一。这就是为什么您需要为 case 分配常量值的原因。它们在编译时进行评估。

答案 4 :(得分:0)

如果目的是使用switch-case语句,则可以抛弃isalnum并为每个字母数字字符设置一堆大小写,并附带一个默认大小写。像这样:

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

[...]

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