C++中switch语句中case 'p' || 'P'语法的问题

4
我曾经这样使用过switch语句:
   switch (ch){
   case 'P' || 'p': 
        goto balance;
        break;

   case 'r' || 'R':
        goto menu;
        break;

   default:
           cout<<"\t\tInvalid Choice!!"<<endl;
           system ("\t\tpause");
           system ("cls");
           goto menu;
           break;
           }

但是以下语法似乎有问题:
case 'r' || 'R'

编译器报错“重复的case值”。我的代码有什么问题?

3
你能引用任何地方的参考资料来证明 case 'P' || 'p': 是有效的语法吗?还是你只是随意编造语法? - abelenky
4
'p'或'P'和'r'或'R'都是1。然后编译器会提示“重复的case值”。 - HirofumiTamori
哦,将英语翻译成编程语言的危险啊。自然而然,错误信息几乎没有任何提示真正的问题所在。 - Mark Ransom
3个回答

10

改为

case 'P':
case 'p': 
    goto balance;
    break;

使用goto通常不是一个好主意。


在您的原始代码中,case 'P' || 'p'等同于case 1,因为||的结果是0,如果两个操作数都是零,否则为1。所以在这两个case语句中,'p' || 'P''r' || 'R'都被评估为1,这就是为什么您会收到有关重复 case 值的警告。


我相信至少会有两个人为使用goto进行辩护...出于某种原因,总是这样(我不是其中之一)。 - LihO
@LihO 实际上我并不反对使用 goto,这就是为什么我说“通常情况下”,但是在与 switch break 一起使用时,我认为这不是一个好主意 :) - Yu Hao
2
如果你要使用 goto,那么之后就不需要立即使用 break - Adam H. Peterson

8
case 'P' || 'p': 
    ...

本意是:

case 'P':
case 'p':
    ...

请注意,还有另一种(在这种情况下更为合理的)方法可供使用:
switch ( std::tolower(ch) ) {
case 'p': 
     ...
     break;
case 'r':
     ...
     break; 

default:
     ...
}

你只需要添加#include <cctype>即可。


3

|| 是一个二元操作符;'P' || 'p' 的结果为 true,因为左操作数非零。同样的,'R' || 'r' 也是如此。所以两个 case 语句都是 case true:,这就是编译器抱怨的原因。请分开这些值。

case 'P':
case 'p':
    menu(); // function call recommended instead of `goto`
    break;

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