使用或运算符的switch语句

41

我正在创建一个控制台应用程序,并使用switch语句创建一个简单的菜单系统。用户输入以大写字母形式显示在屏幕上,但我希望程序能够接受小写字母和大写字母。

我知道switch语句通常用于与常量进行比较,但是否可以像下面这样实现?

switch(menuChoice) {
    case ('q' || 'Q'):
        //Some code
        break;
    case ('s' || 'S'):
        //More code
        break;
    default:
        break;
}

如果这不可能,有没有解决办法?我真的不想重复代码。

7个回答

72

这个能够工作是因为落入机制^^,这也是为什么在每个孤立条件后面都需要break的原因。只是为了那些可能是新手的人们。 - Gisbert12843

26

通常被接受的语法形式是:

switch(menuChoice) {
    case 'q':
    case 'Q':
        //Some code
        break;
    case 's':
    case 'S':
        //More code
        break;
    default:
        break;
}
即:由于缺乏break,程序执行会级联到下一个块。这通常被称为“fall through”。
话虽如此,在这种情况下,您当然可以通过toupper/tolower对'menuChoice'变量的大小写进行归一化处理。

3
我认为这应该是最好的答案,而不是上面的那个答案 - 它不仅回答了如何解决问题,还在你必须转到可能存在或不存在的链接之前告诉你原因。 - AltF4_

4
'q' || 'Q' 的结果是 bool 类型的结果 (true),这个结果会被提升为在 switch 条件中使用的整数类型。因此,它会变成值为 1 的 char 类型。如果编译器允许在多个标签中使用相同的值 (1),则在执行 switch 语句时,menuChoice 将与每个 case 中的值 1 进行比较。如果 menuChoice 的值为 1,则会执行第一个 case 标签下的代码。
因此,建议在每个 case 标签中使用字符常量(它们是 char 类型)作为整数值。

3

只需使用 tolower(),这是我的方法:

SYNOPSIS
#include ctype.h

   int toupper(int c);
   int tolower(int c);

DESCRIPTION toupper() converts the letter c to upper case, if possible.

   tolower() converts the letter c to lower case, if possible.

   If c is not an unsigned char value, or EOF, the behavior of these
   functions is undefined.

RETURN VALUE The value returned is that of the converted letter, or c if the conversion was not possible.

因此,在您的示例中,您可以使用 switch() 来替换:

switch(tolower(menuChoice)) {
    case('q'):
        // ...
        break;
    case('s'):
        // ...
        break;
}

当然,您可以同时使用toupper()tolower()来处理大写和小写字母。

3

在进入switch语句之前,你可以(也应该)使用tolower函数处理你的变量,以提高可读性。


2
switch (toupper(choice))
{
  case 'Q':...
}

...或者tolower。


出于可移植性的考虑,根据B.S.建议,您应该使用tolower。 - There is nothing we can do

2

如果你这样做

case('s' || 'S'):
    // some code
default:
    // some code

无论您输入哪个字符,都将忽略sS,并运行默认代码。因此,您可以决定使用

case 's':
case 'S':
    // some code

或者

switch(toupper(choice){
    case 'S':
        // some code.

toupper 需要包含 ctype.h


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接