【问题标题】:can we write this in C++ switch?我们可以用 C++ 开关写这个吗?
【发布时间】:2011-06-09 23:25:48
【问题描述】:
#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;  

}

如果不是,我们如何在 switch 中使用比较或逻辑运算符? & 为什么我们不能在不使用作用域的情况下声明和初始化变量?

【问题讨论】:

标签: c++ switch-statement


【解决方案1】:

我们可以,但它并不意味着预期的内容(并且在两种情况下都会产生相同的值):您将在一堆非零整数值上执行 逻辑或在这两种情况下,结果都是 true

【讨论】:

    【解决方案2】:

    另一种更简洁的解决方案:

    #include <cstring>
    
    // ...
    
    if (strchr("eioua", i)) cout << "vowel";
    if (strchr("+-/*%", i)) cout << "operator";
    

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

    【讨论】:

      【解决方案3】:

      不,你不能;在 switches 中,您只能隐式使用 == 运算符,并且只能用于整数和枚举类型(第 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 答案中的链接。

      【讨论】:

        【解决方案4】:
        1. 您可以使用 fallthrough 将多个案例值映射到同一个操作。
        2. 诊断消息对此进行了说明 - 可以跳过初始化。但这不只是一个警告吗?

        【讨论】:

          【解决方案5】:

          格式如下:

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

          【讨论】:

            【解决方案6】:

            如果没有 break 语句,之前的案例会“失败”,所以这实现了您正在寻找的 ||

            #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,对于第一部分的正确答案,我会再给出一个 +1,以通过提供链接来避免重复答案。
            猜你喜欢
            • 2022-11-19
            • 1970-01-01
            • 1970-01-01
            • 2023-03-29
            • 2021-11-10
            • 2012-09-06
            • 1970-01-01
            • 1970-01-01
            • 2018-01-11
            相关资源
            最近更新 更多