1
159
原因与类型系统有关。C/C++不支持字符串作为一种类型。它确实支持常量char数组的概念,但它并不完全理解字符串的概念。 为了生成switch语句的代码,编译器必须理解两个值相等意味着什么。对于像int和enum这样的项,这是一个微不足道的位比较。但是编译器应该如何比较2个字符串值呢?区分大小写、不敏感、有文化意识等…如果没有对字符串的完全了解,就无法准确地回答这个问题。 另外,C/C++转换语句通常生成为 branch tables . 为字符串样式的开关生成分支表几乎没有那么容易。 |
2
53
如前所述,编译器喜欢构建优化的查找表
我会提供一个你可能想考虑的替代方案,我过去已经用过了,效果很好。而不是切换字符串本身,而是切换使用字符串作为输入的哈希函数的结果。如果您使用的是一组预先确定的字符串,那么您的代码几乎与切换字符串一样清晰:
有一系列明显的优化,几乎都遵循C编译器对switch语句的处理方式…真有趣。 |
3
29
只能在int、char和enum等基元上使用switch。最简单的解决方案是使用枚举。
|
4
12
显然不是@ MouthCoup上面的C++ 11更新 http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4067/Switch-on-Strings-in-C.htm 使用两个映射在字符串和类枚举之间进行转换(比普通枚举更好,因为它的值在其中有作用域,并且反向查找好的错误消息)。 编译器支持初始值设定项列表,这意味着vs 2013 plus可以在codeguru代码中使用static。GCC4.8.1可以接受,不确定它在多大程度上是兼容的。
…
|
5
11
问题是,由于优化的原因,C++中的转换语句对原始类型的任何东西都不起作用,只能将它们与编译时常数进行比较。 可能造成这种限制的原因是编译器能够应用某种形式的优化,将代码编译为一条cmp指令和一个goto,其中地址是根据运行时参数的值计算的。由于分支和循环不能很好地与现代CPU配合使用,因此这可能是一个重要的优化。 为了解决这个问题,恐怕你不得不求助于国际单项体育联合会的声明。 |
6
7
输出:
在方法内部使用
要在类内有效地使用此模式,请静态初始化lambda映射,否则您需要支付
在这里我们可以摆脱
必须转换lambda上下文捕获
产生与上述相同输出的示例:
|
7
6
在C++和C开关中只对整数类型进行工作。使用if-else阶梯代替。C++显然可以为字符串实现某种SWICH语句——我想没有人认为它值得,我同意。 |
8
6
C++ constexpr哈希函数:
|
9
5
为什么不?你可以使用
switch implementation
具有相同的语法和语义。
这个
您的代码如下:
例如,可以使用更复杂的类型
特征
与语言切换的sintax差异是
为了
读 more about 此开关实现。 |
10
4
我认为原因是,在C字符串中不是原始类型,正如Tomjen所说,将字符串看作char数组,因此不能执行以下操作:
|
11
3
在C++中,只能在int和char上使用开关语句。 |
12
3
在C++中,字符串不是第一类公民。字符串操作通过标准库完成。我想,这就是原因。此外,C++使用分支表优化来优化交换机实例语句。看看这个链接。 |
13
3
要使用尽可能简单的容器添加变体(不需要已排序的映射)…我不必担心枚举——只需将容器定义放在开关前面,这样就可以很容易地看到哪个数字代表哪种情况。
这将在
请注意
测试未定义字符串的版本如下:
|
14
0
不能在开关大小写中使用字符串。只允许使用in t&char。相反,您可以尝试使用枚举来表示字符串,并在开关盒块中使用它,如
在swich case语句中使用它。 |
15
0
开关只能与整型(int、char、bool等)一起使用。为什么不使用map将字符串与数字配对,然后将该数字与开关一起使用呢? |
16
0
|
17
0
在许多情况下,您可以通过从字符串中提取第一个字符并打开它来完成额外的工作。如果您的案例以相同的值开始,那么可能最终不得不在charat(1)上执行嵌套切换。但是,任何阅读您的代码的人都会感激您的提示,因为大多数人会在 |
18
0
针对交换机问题的更多功能解决方案:
|
19
-2
这是因为C++将开关转换为跳转表。它对输入数据执行一个简单的操作,并在不进行比较的情况下跳到正确的地址。因为字符串不是一个数字,而是一个数字数组,所以C++不能从它创建一个跳转表。
(来自维基百科的代码 https://en.wikipedia.org/wiki/Branch_table ) |
ZenBa2 · getopt未更改值C 2 年前 |
Waeez · 条件未满足php仍在运行 6 年前 |
Catz · 正在尝试打印正确数量的“*”以代替数值 6 年前 |
privilegedMale · switch语句中的扫描仪问题 6 年前 |
rasilvap · 具有多个参数的开关箱 6 年前 |
RudziankoÅ · 不可能的类型切换情况:不能有动态类型 6 年前 |
Leo Thomas · 循环case语句而不退出shell脚本 6 年前 |