如果在开关机箱内,则限制机箱
if inside a switch case, to restrict cases
感谢您的回答。
我想知道是否可以使用条件表达式限制 swtich-case 语句的某些情况。像下面的代码一样。
switch(a)
{
case 1:
{
do_1();
break;
}
case 2:
{
do_2();
break;
}
if(condition)
{
case 3:
{
do_3();
break;
}
break;
}
}
编辑,对不起,伙计们,我得到了错误的条件,它与切换变量完全无关。只是另一个条件,外部条件。我只想知道我是否可以限制具有外部条件的情况,否则,如果不满足条件,则不会分析IF内部的情况。
我需要在 if 内进行第二次休息吗?
简短的回答是否定的。您必须颠倒顺序:
case 3:
if (condition)
do_3();
break;
检查每种情况下的条件:
switch(a)
{
case 1:
{
do_1();
break;
}
case 2:
{
do_2();
break;
}
case 3:
{
if (condition)
do_3();
break;
}
case 4:
{
if (condition)
do_4();
break;
}
}
或者使用带有第二个switch
的default
块:
switch(a)
{
case 1:
{
do_1();
break;
}
case 2:
{
do_2();
break;
}
default:
{
if (condition)
{
switch (a)
{
case 3:
{
do_3();
break;
}
case 4:
{
do_4();
break;
}
}
}
break;
}
}
不,你这样做:
case 3:
{
if (a == condition)
do_3();
break;
}
break;
可以完成此操作的两种方法是:
-
使用预处理器宏,假设您的条件可以通过这种方式进行测试。
#ifdef condition case 3: { do_3(); break; } #endif
-
将
if
语句移动到case
块内。case 3: { if (a == condition) do_3(); break; }
C++不支持
这一点。 但是,您可以使用函数调用将交换机拆分为多个部分,以减少代码重复。 如果您尝试按照以下思路执行某些操作:
void func()
{
switch(a)
{
case 1:
{
do_1();
break;
}
case 2:
{
do_2();
break;
}
if(condition)
{
case 3:
{
do_3();
break;
}
case 4:
{
do_3();
break;
}
case 5:
{
do_3();
break;
}
break;
}
}
}
你可以像这样拆分它:
void func()
{
if(!func_a(a) && condition)
func_b(a);
}
bool func_a(a)
{
switch(a)
{
case 1:
{
do_1();
return 1;
}
case 2:
{
do_2();
return 1;
}
default: return 0;
}
}
void func_b(a)
{
switch(a)
{
case 3:
{
do_3();
break;
}
case 4:
{
do_3();
break;
}
case 5:
{
do_3();
break;
}
}
}
你永远无法在那里放置一个if条件,因为它不适用于C++语法。 您应该将 #3 移到 case 语句之外,或者使其成为默认大小写的一部分并检查那里的条件。
它以C++编译。但结果出乎我的意料。
#include <iostream>
#include <string>
int test(int action, bool allow_restricted)
{
int success = -1;
switch(action)
{
case 1:
std::cout << "Performing " << action << std::endl;
success = 0;
break;
case 2:
std::cout << "Performing " << action << std::endl;
success = 0;
break;
if(allow_restricted)
{
case 3:
std::cout << "Performing restricted " << action << std::endl;
success = 0;
break;
case 4:
std::cout << "Performing restricted " << action << std::endl;
success = 0;
break;
}
default:
break;
}
return success;
}
int main()
{
test(1,false);
test(3,false);
test(3,true);
}
这不是我们想要的输出。
Performing 1
Performing restricted 3
Performing restricted 3
它无法按预期工作,因为 switch-case
语句跳转而不是执行 if
语句。
但是在失败的情况下,if
语句有效(在action == 3
和allow_restricted == false
时不起作用(。
int test_fallthrough(int action, bool allow_restricted)
{
int success = -1;
switch(action)
{
case 1:
std::cout << "fallthrough " << 1 << std::endl;
success = 0;
case 2:
std::cout << "fallthrough " << 2 << std::endl;
success = 0;
if(allow_restricted)
{
case 3:
std::cout << "fallthrough restricted " << 3 << std::endl;
success = 0;
case 4:
std::cout << "fallthrough restricted " << 4 << std::endl;
success = 0;
}
default:
break;
}
return success;
}
int main()
{
test_fallthrough(1,false);
test_fallthrough(1,true);
}
输出。
fallthrough 1
fallthrough 2
fallthrough 1
fallthrough 2
fallthrough restricted 3
fallthrough restricted 4
通过开关内部的while
回路,它会变得更加有趣。
void test_fun_fallthrough(int action, bool allow_restricted)
{
bool initialize = false;
switch(action)
{
do
{
case 1:
std::cout << "Fun fallthrough, initializing " << 1 << std::endl;
initialize = false;
case 2:
std::cout << "Fun fallthrough " << 2 << std::endl;
if(allow_restricted)
{
case 3:
std::cout << "Fun fallthrough restricted " << 3 << std::endl;
if(3 == action)
{
initialize = true;
action = 1;
}
case 4:
std::cout << "Fun fallthrough restricted " << 4 << std::endl;
}
} while(initialize);
default:
break;
}
}
int main()
{
test_fun_fallthrough(3,true);
std::cout << "*********************" << std::endl;
test_fun_fallthrough(3,false);
}
Fun fallthrough restricted 3
Fun fallthrough restricted 4
Fun fallthrough, initializing 1
Fun fallthrough 2
Fun fallthrough restricted 3
Fun fallthrough restricted 4
*********************
Fun fallthrough restricted 3
Fun fallthrough restricted 4
Fun fallthrough, initializing 1
Fun fallthrough 2
出乎意料的是,即使allow_restricted
false
,我们也可以跳转到受限制的代码。
相关文章:
- 既然存在危险,为什么项目要使用-I include开关
- 为什么这个音频包络不能通过开关的情况?
- 有人知道为什么在开关中使用stoi函数会返回恒定的错误吗
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 在 c++ 中在开关情况下使用和不使用"break"时的不同输出
- 为什么我的开关/机箱在使用枚举时默认?
- 为什么布尔开关语句有编译器警告?
- 如何使用"equal to"以外的评估编写开关语句
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 无法找到简单的开关大小写枚举错误
- 未达到的情况会影响开关外壳性能
- C++:我的开关盒循环转到第一种情况
- 有没有办法在C++将字符串与开关语句一起使用?
- 开关:无外壳中断
- 带有开关语句的 do-while 循环 -- 无穷循环错误
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- 如何为开关机箱提供可靠的用户输入
- 多个枚举值的开关/机箱
- 开关/机箱不间断循环
- 从VBA传递参数的开关机箱-参数不兼容