以下代码使用带枚举的开关。主程序将参数正确传递给函数,但不执行正确的开关行。你能告诉它为什么没有进入开关条件吗?
enum MyEnum {
Enum1 = 1,
Enum2 = 0x0D
};
bool compute(MyEnum code) {
switch(code) {
Enum1: return true;
Enum2: return false;
};
cout << "why here??" << endl; // this line is getting printed for both inputs
return false;
}
int main() {
cout << "compack=" << compute((MyEnum)1) << endl; // printed "0"
cout << "compack=" << compute((MyEnum)13) << endl; // printed "0"
}
我检查了与switch和enum相关的其他问题(例如3019153),但是无法找出错误。
答案 0 :(得分:6)
您错过了case
关键字:
switch(code) {
case Enum1: return true;
case Enum2: return false;
};
答案 1 :(得分:1)
switch(code)
{
case Enum1: return true;
case Enum2: return false;
};
答案 2 :(得分:1)
你忘了写案例
switch(code)
{
case Enum1: return true;
case Enum2: return false;
};
通用开关类似于:
switch(var)
{
case val1:
foo();
break;
case val2:
bar();
break;
default:
error();
};
答案 3 :(得分:0)
你忘了那里的情况..
switch(code)
{
case Enum1:
//do something
break;
case Enum2:
//do something
break;
};
答案 4 :(得分:0)
好的,其他人已回答您错过了case
关键字。但是,没有解释的是原始代码编译的原因。这是因为没有case
关键字,它被视为goto
标签。事实上,这编译:
switch (i) {
if (j == 3) {
case 1:;
L1:;
} else {
goto L1;
case 2:;
}
}
请注意,j==3
实际上是死代码。它永远不会被执行。有关此实际有用的应用,请参阅Duff's device。顺便说一句,在启用完整警告的情况下进行编译会警告您有关未使用的转到标签,至少使用g++
和clang++
(-Wall -Wextra -pedantic
)。