- 7
- 0
- 约5.64千字
- 约 12页
- 2017-12-22 发布于河南
- 举报
精解C的switch语句
精解C++的switch语句
精解C++的switch语句
来源:/myliupp/archive/2009/08/07/4420792.aspx
入门书籍对switch语句的介绍相对较浅,我也因此而产生了很多想当然的误解。为解惑而写了以下一小篇精解switch语句,相信会对很多朋友有所帮助,同时顺便补充一些相关知识。
先抛出个题目,见下程序:
//原代码出自《C语言参考手册(原书第5版)》
//为了表达我的意图,特做了部分改动
switch(x)
{
default:
if(prime(x))
{
case 2: case 3: case 5: case 7:
process_prime(x);
}
else
{
case 4: case 6: case 8: case 9: case 10:
process_composite(x);
}
}
你能说出它如何执行吗?
switch语句的格式为:
switch(条件)语句
其中,条件的类型可以是整数类型,枚举类型,或者类类型(但该类需要有单一的转换到整数类型或(可以是字符类型,但不能是浮点类型、字符串、指针类型等),语句部分不一定非得是一条复合语句。因此,switch(123[2]+(int)3.1);是条合法的switch语句,switch(j)case 5:i++;也是条合法的switch语句。如果switch的语句部分是一条非复合语句,则其内定义的变量作用域,效果上等同于该条语句加上了{}。如int i=3;switch(i)int i=4;,相当于int i=3;switch(i){int i=4;},因此这并不会导致同一局部域下的重复定义错误。
如果条件为类类型,则该类内要有一个用户定义的类型转换操作符重载函数。如下边代码:
#include iostream
using namespace std;
class CTest
{
public:
operator int(){coutintendl;return data;}
operator char(){coutintendl;return static_castchar(data);}
CTest(int i):data(i){}
CTest(char c):data(c){}
private:
int data;
};
int main()
{
CTest x1(3);
CTest x2(5);
switch(x1)
{
case 5:break;
case 3:break;
}
return 0;
}
在VC++6下,编译器会报如下错误信息:
error C2450: switch expression of type class CTest is illegal Ambiguous user-defined-conversion
因为类型转换函数有两个都是整数类型,编译器无法判断该去调用哪一个进行转换。
条件也可以是int i=3这样的初始化,其结果就是i的值。其作用域从声明处开始,直至switch语句的结束。可以理解成在switch外再加上了{}。int i=3,j=4这样的多个初始化,在C++标准中,不是条件。
语句部分,可以出现多个case标号以及一个default标号,它们的出现顺序随意。一个case标号或default标号,与属于其上层最近的switch语句,如:
switch(i)
{
case 1:
case 2:
if(a5)
{
case 3:
case 4:
b=4;
switch(j)
{
case 5:
default:;
}
default:;
}
}
中,case 3:、case 4:,以及最后一个default:,属于外层switch,虽然它们在if语句内。注意在上面的代码中,}前的最后一个标号,后面至少要出现一条语句,因此
原创力文档

文档评论(0)