草庐IT

Switch-case

全部标签

c++ - 如何制作更安全的 C++ 变体访问者,类似于 switch 语句?

很多人使用C++17/boost变体的模式看起来与switch语句非常相似。例如:(snippetfromcppreference.com)std::variantv=...;std::visit(overloaded{[](autoarg){std::cout问题是当您在访问者中输入错误类型或更改变体签名时,却忘记更改访问者。您将调用错误的lambda,通常是默认的,而不是得到编译错误,或者您可能会得到一个您没有计划的隐式转换。例如:v=2.2;std::visit(overloaded{[](autoarg){std::cout枚举类上的Switch语句更加安全,因为您不能使用不属

C++ 长 switch 语句还是用 map 查找?

在我的C++应用程序中,我有一些值作为代码来表示其他值。为了翻译代码,我一直在争论是使用switch语句还是STLmap。开关看起来像这样:intcode;intvalue;switch(code){case1:value=10;break;case2:value=15;break;}map将是stl::map并且翻译将是使用用作键值的代码进行简单查找。哪个更好/更高效/更清洁/被接受?为什么? 最佳答案 就个人而言,我会使用map,因为它的使用意味着数据查找-使用开关通常表示程序行为的差异。此外,使用map修改数据映射比使用开关更

c++ - 如何解决此错误 : jump to case label crosses initialization

这个问题在这里已经有了答案:Error:Jumptocaselabelinswitchstatement(4个回答)关闭8年前.我的计算器代码中有以下错误,不知道如何更正。请任何建议都会有所帮助。错误:错误:跳转到案例标签[-fpermissive]|错误:跨过“intsum”的初始化|错误:未在此范围内声明“退出”|代码:#include#includeusingnamespacestd;voiddisplay_menu();intget_menu_choice();voidget_two_numbers(int&a,int&b);intadd(inta,intb);intsubtr

c++ - 是否可以将 goto 与 switch 一起使用?

C#似乎可以,但我需要C++,最好是跨平台。基本上,我有一个开关,可以根据单个条件对内容进行排序,然后在其他所有内容上回退到默认处理。说:switch(color){caseGREEN:caseRED:caseBLUE:Paint();break;caseYELLOW:if(AlsoHasCriteriaX)Paint();elsegotodefault;break;default:Print("Uglycolor,nopaint.")break;} 最佳答案 艾哈迈德的回答很好,但也有:switch(color)caseYELLO

c++ - 如何在 C++ 的 switch 语句中使用枚举值?

我想为switch语句使用enum值。是否可以使用"{}"中包含的enum值作为switch()"的选择?我知道switch()需要一个integer值,以便将编程流程引导到适当的case编号。如果是这种情况,我是否只为enum语句中的每个常量创建一个变量?我还希望用户能够选择选项并将该选项传递给switch()语句。例如:cout>????switch(????){case1/EASY://(canIjusttypecaseEASY?)cout 最佳答案 您可以像使用整数一样使用枚举值:myChoicec;...switch(c)

php - 我应该在 switch 语句中使用 continue 吗?

我注意到您确实可以在switch语句中使用continue关键字,但在PHP上它并没有达到我的预期。如果PHP失败了,谁知道还有多少其他语言也失败了?如果我经常在语言之间切换,如果代码的行为不像我预期的那样,这可能是个问题。我应该避免在switch语句中使用continue吗?PHP(5.2.17)失败:for($p=0;$pC++似乎按预期工作(跳转到for循环的末尾):for(intp=0;p 最佳答案 尝试使用continue2继续围绕switch语句的循环的下一次迭代。编辑:$foo='Hello';for($p=0;$p"

c++ - 在 C++ 中使用 switch 评估字符串

这个问题在这里已经有了答案:Whycan'ttheswitchstatementbeappliedtostrings?(22个回答)关闭9年前。我想用开关评估一个字符串,但是当我读取用户输入的字符串时,我会抛出以下错误。#includeusingnamespacestd;intmain(){stringa;cin>>a;switch(string(a)){case"Option1":couterror:invalidcastfromtype'std::string{akastd::basic_string}'totype'int 最佳答案

c++ - C/C++ : switch for non-integers

很多时候我需要根据一个非POD常量元素的值来选择做什么,像这样:switch(str){case"foo":...case"bar":...default:...}遗憾的是switch只能与整数一起使用:错误:开关量不是整数。实现这样的事情最简单的方法是拥有一个ifs序列:if(str=="foo")...elseif(str=="bar")...else...但是这个解决方案看起来很脏,应该花费O(n),其中n是案例的数量,而在最坏的情况下,使用二分搜索,这段代码可能花费O(logn)。使用一些数据结构(如Maps)可以获得一个表示字符串的整数(O(logn)),然后使用O(1)sw

C++ switch 语句表达式求值保证

关于开关,标准规定如下。“当switch语句被执行时,它的条件被评估并与每个case常量进行比较。”是否意味着条件表达式只计算一次,并且每个编译器都有标准保证?例如,当一个函数用在switch语句头部时,会有副作用。intf(){...}switch(f()){case...;case...;} 最佳答案 我认为保证f只被调用一次。首先我们有Theconditionshallbeofintegraltype,enumerationtype,orclasstype.[6.4.2(1)](非积分的东西在这里不适用),和Thevalueo

c++ - 'element' 的初始化被 'case' 标签跳过

这个问题在这里已经有了答案:Whycan'tvariablesbedeclaredinaswitchstatement?(23个回答)关闭5年前.我不明白为什么会出现错误:initializationof'element'isskippedby'case'label.谁能给我解释一下?voidLinkedList::process_example(intchoice){switch(choice){case1:coutprintSet();cout>element;cin.clear();cin.ignore(200,'\n');this->Addelementfromback(ele