使用switch语句可以解决的最大案例数

时间:2013-12-03 16:05:04

标签: c++ switch-statement standards

这是出于好奇。我可以在一个交换机中包含默认: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个案例   声明得到支持!真正的价值必须是实施   依赖

但我不知道这些信息有多准确,有人可以给我一个想法吗?另外,依赖于实现的是什么意思?假设存在这样的限制,我可以以某种方式将其更改为更高或更低的值吗?

5 个答案:

答案 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 standardAnnex 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语句允许不同数量的情况。