这真的很奇怪。所以我有这个简单的switch-case语句,如果用户键入一个大写字母的大写或小写版本,它应该执行操作:
switch (choice)
{
case 'A' || 'a':
cout << "hello"; break;
case 'B' || 'b':
cout << "hello"; break;
case 'C' || 'c':
cout << "hello"; break;
case 'D' || 'd':
cout << "hello"; break;
}
MS Visual Studio给出了三个错误:“B”/“b”,“C”/“c”和“D”/“d”,每个都说如下:
IntelliSense: case label value has already appeared in this switch
它没有给我这个'A'/'a'的错误 - 如果我摆脱了案例A,它允许案例B而不是以下案例。我想不出为什么第一个“或”案件应该没问题的任何理由,但在下列情况下会感到不安。
上下文:编写容器类,这段代码在main函数之外,但我认为这与它没有任何关系。
有什么想法?如果在C ++中不允许这样做,是否有更好的方法为一个案例包含多个选项?
答案 0 :(得分:7)
||
是符合逻辑的OR。其操作数转换为bool
- 零到false
,其他所有为true
。结果为true
或false
,然后分别转换为1
和0
。因此,所有四种情况都等同于case 1:
,并且编译器会抱怨,因为在同一switch
语句中不能有两个具有相同值的case常量。
你想要的是:
case 'A':
case 'a':
cout << "hello"; break;
利用了堕落行为。
答案 1 :(得分:1)
case 'A' || 'a':
- &gt;案例1:
逻辑运算符的输出可以是true(1)或false(0),因此编译器将具有多个具有0&1和0的开关情况。
因此无法确定要调用的案例。