这是出于好奇。我可以在一个交换机中包含默认:case的最大交换机案例数。我的意思是这样的:
switch(ch)
{
case 1:
//some statement
break;
case 2:
//some statement
break;
.
.
.
.
case n:
//some statement
break;
default:
//default statement
}
我的问题是我们可以在这里获得的最大价值是多少?虽然这不是编程上重要的,但我发现这是一个相当有趣的想法。我搜索了一些博客并发现了一条声明here。
从我的文件来看,据说:
标准C指定交换机至少可以有257个案例 声明。标准C ++建议至少16,384个案例 声明得到支持!真正的价值必须是实施 依赖
但我不知道这些信息有多准确,有人可以给我一个想法吗?另外,依赖于实现的是什么意思?假设存在这样的限制,我可以以某种方式将其更改为更高或更低的值吗?
答案 0 :(得分:18)
draft C++ standard Annex B (informative) Implementation quantities
说(强调我的):
由于计算机是有限的,因此C ++实现不可避免地受限于它们可以成功处理的程序的大小。 每个实施都应记录已知的限制。 [...]
限制可能会限制包含下述数量或其他数量的数量。建议将每个数量后面的括号内的数字作为该数量的最小值。但是,这些数量只是指导原则而不是确定合规性。
并包含以下项目:
- switch语句的大小写标签(不包括任何嵌套switch语句的大小写)[16384]。
但这些并不是硬限制,只是对最小值的建议。
实现是编译器,标准库和支持工具,因此实现依赖基本上意味着在这种情况下编译器将决定限制是什么,但它应该记录此限制。标准草案将1.3.10
部分中的实现定义的行为定义为:
行为,对于格式良好的程序构造和正确的数据,这取决于实现和每个实现文档
我们可以看到 C 的gcc
does not impose a limit:
GCC仅受可用内存的限制。
在这种情况下也应该涵盖 C ++ ,看起来Visual Studio也没有限制:
Microsoft C不限制switch语句中的case值数量。该数量仅受可用内存的限制。 ANSI C要求在switch语句中允许至少257个案例标签。
我找不到clang
的类似文档。
答案 1 :(得分:4)
您的问题标记为C ++,因此根据C ++ 98 Annex B / 1:
因为计算机是有限的,所以C ++实现是不可避免的 他们可以成功处理的程序大小有限。 每个实施都应记录已知的限制。 本文档可能会引用固定的限制,如何存在 计算变量限制作为可用资源的函数,或者说 固定限制不存在或未知。
然后是附件B / 2:
限制可能会限制包括下述数量的数量 或其他人。建议在每个数量后面加上括号 作为该数量的最小值。但是,这些数量只是 指南并不确定合规性。
因此,只要实现记录了它正在做的事情,就允许任何最大数量的case语句。但是,标准建议在以下列表中使用16384。
答案 2 :(得分:2)
Per the c99 standard,部分5.2.4.1
翻译限制说:
实现应能够翻译和执行至少一个程序 包含以下每个限制的至少一个实例: 13)
并包含以下一行:
- 开关语句的1023个案例标签(不包括任何嵌套开关的案例标签) 语句)
Per c++98 standard,Annex B (informative) Implementation quantities
说:
限制可能会限制包括下述数量的数量 或其他人。建议在每个数量后面加上括号 作为该数量的最小值。但是,这些数量只是 指南并不确定合规性。
- switch语句的大小写标签(不包括任何嵌套语句的大小写标签) 转换声明)[16 384]。
答案 3 :(得分:0)
实现依赖意味着,行为不是由标准定义的,而是编译器的决定。 C ++标准没有为switch语句支持多少个标签设置最小值。
答案 4 :(得分:0)
理论上,switch语句的最大案例数取决于您使用的变量的数据类型:
data_type x
switch(x)
{
...
}
char , 256 ,短,您有65536 ......等等;给定data_type可以表示的最大值。
但是,编译器必须为此开关生成代码(语句),并且通常生成的代码类似于
cmp(R1,$value)
IFT jmp _subroutine
cmp(R1,$value2)
IFT jmp _subroutine2
...
您添加的案例越多,寄存器的压力越大,代码大小越大。由于内存和寄存器不是无限的,并且编译器是人为编写的,因此必须有一个限制 - 这就是implementation dependent
的含义。每个编译器都可以为switch语句允许不同数量的情况。