Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cpp-为什么你可以';t使用布尔、浮点和;switch语句中的字符串 我是C++新手,目前正在学习切换语句,但我不知道为什么我使用BooLoin、String、String?时,编译器会抛出错误或警告(如果是布尔值)?_C++_Floating Point_Integer_Switch Statement_Boolean - Fatal编程技术网

cpp-为什么你可以';t使用布尔、浮点和;switch语句中的字符串 我是C++新手,目前正在学习切换语句,但我不知道为什么我使用BooLoin、String、String?时,编译器会抛出错误或警告(如果是布尔值)?

cpp-为什么你可以';t使用布尔、浮点和;switch语句中的字符串 我是C++新手,目前正在学习切换语句,但我不知道为什么我使用BooLoin、String、String?时,编译器会抛出错误或警告(如果是布尔值)?,c++,floating-point,integer,switch-statement,boolean,C++,Floating Point,Integer,Switch Statement,Boolean,我怎样才能解决这个问题?或者为什么它会出现在过去的日子里,有时在今天,switch语句被翻译成分支或跳转语句的数组,最好是连续的 与数组一样,索引为8.9、“frog”和“false”没有意义 < > C语言和C++语言是为了编译效率而设计的。跳转指令数组比必须执行“if-else-if”梯形图(其他索引类型(如浮点、文本或字符串)要高效得多 对于那些迂腐的读者: 使用整数作为案例值可以更好地优化(实现)决策结构。连续(连续)案例值允许更好的优化或实施。最佳决策结构是一组跳转、分支指令或函数指针

我怎样才能解决这个问题?或者为什么它会出现在过去的日子里,有时在今天,
switch
语句被翻译成分支或跳转语句的数组,最好是连续的

与数组一样,索引为8.9、“frog”和“false”没有意义

< > C语言和C++语言是为了编译效率而设计的。跳转指令数组比必须执行“if-else-if”梯形图(其他索引类型(如浮点、文本或字符串)要高效得多

对于那些迂腐的读者:
使用整数作为案例值可以更好地优化(实现)决策结构。连续(连续)案例值允许更好的优化或实施。最佳决策结构是一组跳转、分支指令或函数指针

例如,最佳实现是:
destination_address=switch_table[case_value]
许多处理器可以用一条指令实现这一点

其他语言可以实现一个表。浮点数大小写值的一个问题是,比较是否等于浮点数很困难,因为并非所有数字都可以用浮点数精确表示。例如,如果您有
案例3.14:
,并且您的索引是
3.14159
,那么案例是否已激活

对于字符串或文本大小写值,必须比较足够的字符以确定相等性。例如,“双曲线”和“超曲线”需要经过5次迭代才能确定等式。可以使用散列,但散列函数的执行可能比要比较的字母要多


< >为了允许<>代码>开关>代码>语句的紧凑高效的实现,C语言和C++语言的作者决定将<代码>案例<代码>值限制为整数。其他形式,如字符串,将需要
if-else if
梯形图、表搜索或字典(map)。

首先,您可以在switch语句中使用布尔值:

int main(int argc, char** argv) {
    bool b = argc > 1;
    switch (b) {
    case true:
        break;
    case false:
        break;
    }
}
如上所述,
浮点数
不适用于相等性测试

既然你问“我怎样才能解决这个问题?”,对于字符串,我建议使用一个无序的地图:

std::unordered_map<std::string, int> m = { {"abc", 1}, {"qwe", 2} };
switch(m["foo"]) {
case m["abc"]:
...
}
无序映射m={{“abc”,1},{“qwe”,2}; 开关(m[“foo”]){ 案例m[“abc”]: ... }
switch
相当原始,主要基于相同的C版本。这基本上就是
switch
在后端实现的方式。你只能比较int或char,没有比“语言选择不允许这样做”更清楚的答案了<但是,code>floats在任何语言中都没有意义,因为浮点很少是精确的,使用
float
s的直接等式语句通常是个坏主意。否则,这个问题的另一部分(带字符串)以前曾多次作为重复项被问过(另请参见:,等等)。表面上的答案是
开关
需要整数类型。(不仅仅是
int
char
;任何整数类型都可以)@ThomasMatthews虽然跳转表是switch语句的一种可能实现,但这并不像我想象的那样常见(至少从我使用编译器资源管理器的经验来看)。这似乎主要发生在大密度范围内。否则,对于较小的密集范围或稀疏范围,程序集通常会生成类似于二进制搜索的内容。如果您需要有效的
switch
语句,请将
case
语句排列为连续值并按递增顺序排列。我很想否决这一点
switch
语句不限于连续整数,甚至不限于紧凑的整数,因为它们适合包含少量缺失整数的区间。它们可能非常分散,不适合阵列调度。编译器可以自由地将它们实现为某种形式的数组分派、二进制查找、串行测试、混合或其他方式。二进制查找对于浮点值和整数一样容易。所以这个答案并不能回答这个问题。所以,我应该最好删除这个词,因为这似乎意味着所有情况(或者我的观点是错误的)?不管这个答案是什么,是否有过这样的情况:
switch
语句只被翻译成某种形式的跳转数组?如果程序员编写的案例包括−20000和+20000,编译器是否生成40001个数组项或编译失败?你能把这个记录下来吗?当C标准制定时,它仍然是真的吗?如果没有,那么理由是什么呢?我将不得不挖掘我较小的8位和16位机器(包括嵌入式系统),运行那些编译器,以便得到你想要的证据。同样,我并不是说总是使用跳转表,而是说它们是一个最佳的实现。C语言和C++语言部分地设计了发射高效机器语言(汇编指令)。其他语言是为了提高开发效率而开发的(不一定是高效的实现)。同样,其基本原理是基于高效的实现。谢谢你的回答,但我只是一个初学者,不知道什么是地图和所有