IOS switch case语句-case知多少

IOS switch-case知多少
时间: 22:40:40
&&&& 阅读:5048
&&&& 评论:
&&&& 收藏:0
标签:1. switch参数类型
switch参数类型要求是integer type,准确来讲,是可以转换成integer的类型, 这包括所有的C基本数据类型((signed/unsigned)char, (short/long signed/unsigned)int, float, double, longlong, bool(C++/objective-c) ),还有枚举类型,但是不包括字符串、结构体、联合体、对象、函数指针等复杂类型。
其实字符串地址指针、对象址指指针等指针,都是可以转化为UInteger, 因为它们在内存中地址都可以理解成unsigned int, 但是为什么不能使用这些指针作为switch的参数呢? 这是因为这些指针都是动态指定的,每次运行编译器/程序指定的地址不尽相同,这就会导致case语句会无法判断是哪一种条件成立,而case后面的条件要求必须是常量;复杂对象的引用往往是利用指针指向的,既然指针都是无法确定其值的,所以复杂对象自然无法作为switch参数了.
e.g. 1 下面这段代码使用NSString指针作为switch参数,编译无法通过, 提示Statement requires expression of integer type(‘NSString *__strong‘ invalid)错误
NSString *str = [NSString stringWithFormat:@"I am a string."];
NSLog(@"(NSInteger)str=%lx", (NSInteger)str);
switch (str) {
case (NSInteger)nil:
NSLog(@"case nil");
NSLog(@"case default");
e.g. 2将switch参数(NSString * )str 修改为(UInteger)str后编译通过,运行也无错误,但是却没有执行任何case语句
NSString *str = [NSString stringWithFormat:@"I am a string."];
NSLog(@"(NSInteger)str=%lx", (NSInteger)str);
switch ((NSInteger)str) {
case (NSInteger)nil:
NSLog(@"case nil");
NSLog(@"case default");
&再次运行发现,两次运行(NSInteger)str 输出的地址结果都不一样
第1次 Log输出
(NSInteger)str=
&第2次 Log输出
(NSInteger)str=
这样自然就匹配不到正确确定的case 语句了。如果想要匹配怎么办?那就只能改用if-else语句了,能达到更灵活的效果。
NSString *str = [NSString stringWithFormat:@"I am a string."];
NSString *str2 =
if (str2 == str) {
NSLog(@"\nstr2 == str");
NSLog(@"\nstr2 != str");
str2 == str
2.case 语句块注意问题
case 语句是为了匹配switch中的参数的值,所以其条件值必须是常数(const).
case 作为一个局部语句块,也能拥有的自己的变量与内存空间,那么在case语句块内部声明变量时,应该确保块内定义的变量,不被块外使用,否则会导致编译错误(块外对变量不具有可见性);如果是间接使用,则可能导致运行错误(内存地址已被释放,在引用可能指向一个错误位置, 也就是所谓的野指针)。
如果定义了新的变量,则需要用代码块表示符号‘{}‘括起来,否则可能编译阶段报错。
switch (1) {
NSLog(@"1. a=%d", a);
NSLog(@"2. a=%d", a);
//编译错误 使用未声明标示符‘a‘
int a=2; //正常通过编译
NSLog(@"3. a=%d", a);
//编译错误 非预期表达式
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!1338人阅读
------、期待与您交流!
-------switch语句用法
1.switch语句格式
switch(表达式)
&case 常量表达式1:语句1;break;
&case 常量表达式2:语句2;break;
&case 常量表达式n:语句n;break;
&default: 语句n+1;break;
2.注意事项
(1)switch后面的值必须是整型数据或者可以转换成整型的数据,例如:‘a’=97。
(2)case后面可以是常量也可以是常量表达式,但必须是整型数据。
(3)case后的常量表达式可以加括号也可以不加括号。
(4)case后面的空格和常量表达式结束后的冒号不可省略。
(5)case后的第一句话不能定义变量,如果非要定义变量,需要加{}。
(6)default可以任意放置,因为当没有合适的case条件语句后才会执行到它,一般我们把它放到末尾。
(7)语句末尾一定要加break,如果不加break,则执行完该语句后会接着往下执行,因为程序执行完该语句后并没有跳出来。
3.switch语句程序示例
从键盘输入一个数,1-7分别代表周一到周日,并且打印输出结果,如果数字不在1-7范围则打印输出错误,请重新输入。
int main()
printf(&请输入一个数值:\n&);
scanf(&%d\n&,&x);
case 1: printf(&今天是周一\n&);
case 2: printf(&今天是周二\n&);
3: printf(&今天是周三\n&);
4: printf(&今天是周四\n&);
5: printf(&今天是周五\n&);
6: printf(&今天是周六\n&);
7: printf(&今天是周日\n&);
printf(&输入错误,请重新输入\n&);
从键盘输入1,打印输出为今天是周一。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3456次
排名:千里之外
原创:11篇5162人阅读
Objective-c(50)
实际上,object-c中switch的参数只能是int,byte,char,short的类型。
然而,我们经常要使用到NSString来作为参数,我在这里举例说明一种间接实现的方法。这个方法一眼看上去好像不灵活限制了NSString参数的个数,但话说回来,既然用到了switch...case那么,所要传入的参数应该是有限和已知的。
//把用到的字符串参数放到一个数组里
NSArray *aName =&[NSArray&arrayWithObjects:@&lee&,@&tom&,@&vivid&,@&liming&,@&stormer&,@&jun&,nil];
//比如我们要把@&stormer&作为switch的参数,则取到它在数组中的下标,然后在switch中根据下标来进行处理。
int index = [aName&&indexOfObject:@&stormer&];
int index = [diindexOfObject: inputValue];
switch(index)
case 0: //
case 1: //
case 2: //
case 3: //
case 4: //这里就是stormer的代码处理部分;
case 5: //
------------
更清晰的:
NSString *theString = @&item3&;
// The one we want to switch on
NSArray *items = @[@&item1&, @&item2&, @&item3&];
int item = [items indexOfObject:theString];
switch (item) {
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2116568次
积分:25592
积分:25592
排名:第196名
原创:678篇
转载:693篇
评论:164条
文章:16篇
阅读:3235
文章:18篇
阅读:6341
文章:23篇
阅读:4408
(24)(24)(24)(15)(11)(6)(12)(17)(8)(21)(12)(31)(12)(9)(9)(13)(23)(7)(25)(10)(17)(13)(9)(8)(9)(3)(5)(11)(17)(23)(37)(30)(14)(60)(19)(25)(40)(35)(51)(41)(66)(34)(35)(50)(50)(22)(23)(23)(32)(28)(35)(19)(23)(39)(30)(12)(22)(1)(18)(8)(3)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(2)(1)(2)(3)(2)(1)(1)(1)(1)(1)主题 : extern定义的常量在switch case中无法使用
级别: 新手上路
可可豆: 77 CB
威望: 77 点
在线时间: 29(时)
发自: Web Page
来源于&&分类
extern定义的常量在switch case中无法使用&&&
----------Constant.h----------FOUNDATION_EXTERN NSInteger const USERGROUP_SA;---------Constant.m---------NSInteger const USERGROUP_SA = 1;---------xxController.m------ (void)viewDidLoad {    [super viewDidLoad];    switch (self.loginUser.groupID) {        case USERGROUP_SA: // 报错“Expression is not an integer constant expression”            //.........do something                        ................        default:                }}在编译的时候case这里报错,错误信息为“Expression is not an integer constant expression”。请问为什么会报错?
级别: 侠客
UID: 331913
可可豆: 408 CB
威望: 345 点
在线时间: 526(时)
发自: Web Page
实测LZ代码没有错误,可以运行- (void)viewDidLoad {&&&&[super viewDidLoad];&&&&// Do any additional setup after loading the view, typically from a nib.&&&&&&&&&&&&NSLog(@&count = %ld&, USERGROUP_SA);&&&&&&&&NSInteger myId = 1;&&&&&&&&switch (myId) {&&&&&&&&case USERGROUP_SA:&&&&&&&&&&&&NSLog(@&yes&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&default:&&&&&&&&&&&&&&&&}} 17:11:53.055 demo[] count = 1 17:11:53.055 demo[] yes是不是别的地方写错了&&比如你groupID的类型
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版

我要回帖

更多关于 c switch case语句 的文章

 

随机推荐