为什么布尔 switch 语句有编译器警告?

use*_*653 2 c++ c++17

为什么下面的代码会产生警告:“警告:开关条件具有布尔值”

#include <iostream>
using namespace std;

int main() {
    
    const bool yes = true;
    
    switch (yes) {
        case true: cout << "sure" << endl; break;
        case false: cout << "nope" << endl;
    }
        
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

switch 语句只接受数字和字符吗?

Jer*_*ner 6

我的猜测是编译器编写者想警告您有关以下潜在错误的信息:

char c;
[...]

switch(c==getchar())  // oops!  Probably not what was intended
{
   case 'a':  cout << "you entered a" << endl; break;  // will never be called
   case 'b':  cout << "you entered b" << endl; break;  // will never be called

   // will always be called, because (c==getchar()) always evaluates to either 0 or 1
   default:   cout << "you entered something else: " << c << endl; break;  
}
Run Code Online (Sandbox Code Playgroud)

...当你打算写:

char c;
[...]

// works as advertised
switch(c=getchar())
{
   case 'a':  cout << "you entered a" << endl; break;
   case 'b':  cout << "you entered b" << endl; break;
   default:   cout << "you entered something else: " << c << endl; break;
}
Run Code Online (Sandbox Code Playgroud)

通常你不会switch在布尔值上使用,因为只有两种可能的情况,if或者三元运算符也可以,例如:

if (yes) cout << "sure" << endl;
    else cout << "nope" << endl;
Run Code Online (Sandbox Code Playgroud)

... 甚至

cout << (yes ? "sure" : "nope") << endl;
Run Code Online (Sandbox Code Playgroud)