我们可以用C ++开关写这个吗?

时间:2011-01-16 12:44:57

标签: c++ switch-statement

#include <iostream>
using namespace std;

int main(){
char i;
cin >>i;
switch (i){
 case ('e'||'i'||'o'||'u'||'a'):
     cout<<"Vowel";
     break;
 case ('+'||'-'||'/'||'*'||'%'):
     cout<<"Op";
     break;
 }
return 0;  

}

如果不是我们如何在交换机中使用比较或逻辑运算符? &安培;为什么我们不能在不使用范围的情况下在单例中声明和初始化变量?

6 个答案:

答案 0 :(得分:7)

如果没有中断声明,之前的案例会“失败”,这样就可以实现您所寻找的||

#include <iostream>
using namespace std;

int main(){
   char i;
   cin >>i;
   switch (i){
    case 'e':
    case 'i':
    case 'o':
    case 'u':
    case 'a':
        cout<<"Vowel";
        break;
   case '+':
   case '-':
   case '/':
   case '*':
   case '%':
        cout<<"Op";
        break;
   }
   return 0;  
}

问题的其他部分的答案is discussed in depth already on stackoverflow

答案 1 :(得分:2)

  1. 您可以使用fallthrough将多个案例值映射到同一个操作。
  2. 诊断消息解释了它 - 可以跳过初始化。但这不是一个警告吗?

答案 2 :(得分:2)

不,你不能;在switch中,您只能隐式使用==运算符,而只能使用整数和枚举类型(第6.4.2节)。您应该将switch重写为

switch (i){
 case 'e':
 case 'i':
 case 'o':
 case 'u':
 case 'a':
     cout<<"Vowel";
     break;
 case '+':
 case '-':
 case '/':
 case '*':
 case '%':
     cout<<"Op";
     break;
 }

利用了switch语句的直通功能。

  

如果不是我们如何在switch中使用比较或逻辑运算符?

简单地说,你不能。如果你想做与积分/枚举类型的相等比较不同的事情,你必须写几个if / else语句。

  

&安培;为什么我们不能在不使用范围的情况下在单例中声明和初始化变量?

这不是声明的问题,而是初始化的问题;请参阅@ awoodland的答案中的链接。

答案 3 :(得分:1)

将其格式化为:

switch (i)
{
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
        cout << "Vowel";
        break;
}

答案 4 :(得分:0)

替代方案,更简洁的解决方案:

#include <cstring>

// ...

if (strchr("eioua", i)) cout << "vowel";
if (strchr("+-/*%", i)) cout << "operator";

请注意,strchr会考虑字符串的终止零部分,因此i不应为0.

答案 5 :(得分:0)

我们可以,除了它并不意味着什么(并在两种情况下产生相同的值):你将对一堆非零整数值执行逻辑或在这两种情况下结果都是 true