两则C语言技巧

aoyunbaobei 2008-05-09 03:24:57
以前用C++时,喜欢去玩一些语法上的技巧,每学到一个技巧都高兴得不得了,总是想找个地方用它,以显示自己的水平。其实我们应该更关心技巧的实用价值,如果一项技巧很巧妙,但很少用它,忘掉了也不必觉得可惜。最近发现两则C语言技巧,以前没有用过,觉得有些实用价值,做个笔记吧。



1. 数组初始化。

常见的数组初始化方法:

int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};




通常情况下,这种做法没有问题。再看看下面这个例子:

enum

{

FRUIT_APPLE,

FRUIT_PEAR,

FRUIT_BANANA,

FRUIT_NR

};



int price[FRUIT_NR] = {20, 25, 30};




这段代码有个潜在前提,那就是枚举的顺序不能变化。一旦变化,整个逻辑都乱了,这样的BUG能否查出来要靠运气。这样的假设是靠不住的,特别是当枚举是第三方库提供的时候,他们调整枚举的顺序后绝对不会通知你。为了避免这样的潜在隐患,可以用下面的方法:

Enum

{

FRUIT_APPLE,

FRUIT_PEAR,

FRUIT_BANANA,

FRUIT_NR

};



int price[FRUIT_NR] = { [FRUIT_APPLE] = 20, [FRUIT_PEAR] = 25, [FRUIT_BANANA] = 30};






2. 处理case语句。

处理case语句,有很多case情况要做相同的处理时,通常的做法是:

switch(value)

{

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:

{

printf("ok\n");

break;

}

default:break;

}




这样写当然没有错,只是比较繁琐,特别是这样情况很多时。如果这些值是连续的,我们可以用下面的方法:

switch(value)

{

case 0 ... 9:

{

printf("ok\n");

break;

}

default:break;

}






这两个技巧好像是属于C语言新标准的,我只是在gcc上测试过,不能保证可移植性。

转自:http://blog.csdn.net/absurd/
...全文
1023 98 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
98 条回复
切换为时间正序
请发表友善的回复…
发表回复
hoomey 2008-10-09
  • 打赏
  • 举报
回复
学习。。
yuewei1231 2008-06-11
  • 打赏
  • 举报
回复
学习了啊
lan_6373836 2008-06-11
  • 打赏
  • 举报
回复
牛,学到了!
missyougoal 2008-06-11
  • 打赏
  • 举报
回复
收了 谢谢
Ryan_Curt 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 77 楼 lin_style 的回复:]
第一个确实很奇怪,为什么用枚举做下标?
第二个的case很少说会case一个直接的变量或者常量吧?至少都是定义成宏的,这样看起来更直观
比如,一个返回值 有1,2,3
通常代表意义如下
#define 1 STA_SEND
#define 2 STA_RECV
#define 3 STA_OTHER

switch()
case STA_SEND:
case STA_RECV:

,很少会直接 case 1 ,鬼知道1代表什么意思
,或许在数学软件中有1..9这样的需求
[/Quote]

确实是这样的,在实际项目中不追求这些所谓的技巧。
eatsweetpotato 2008-06-11
  • 打赏
  • 举报
回复
case 0 ... 9:
第一次见
qmm161 2008-06-11
  • 打赏
  • 举报
回复
基本同意67楼意见,这种花样技巧,在实际应用中基本用不上!如果你的case多到需要用...来表示的话,就应该考虑换种其他的方式来实现了,如数组映射!
Sevenlight_x 2008-06-11
  • 打赏
  • 举报
回复
来学习的,谢谢
fhb13 2008-06-11
  • 打赏
  • 举报
回复
不错,多谢共享。
coverallwangp 2008-06-11
  • 打赏
  • 举报
回复
mark
davelv 2008-06-11
  • 打赏
  • 举报
回复
gcc编译通过~~
zzhprogram 2008-06-11
  • 打赏
  • 举报
回复
赞成第一条,第二条慎用
aiangela 2008-06-10
  • 打赏
  • 举报
回复
收藏了
starzeng 2008-06-10
  • 打赏
  • 举报
回复
用c当然先讲究实用性,再说技巧,以上有点意思,但没什么实用价值。
puzzlesky 2008-06-09
  • 打赏
  • 举报
回复
学习了
weiyijiji 2008-06-09
  • 打赏
  • 举报
回复
0到9之间是3个点还是2个
性能侠客行 2008-06-09
  • 打赏
  • 举报
回复
例子2可移植性不好啊
wanghui5257 2008-06-09
  • 打赏
  • 举报
回复
拿分了再看。
WEN2222 2008-06-09
  • 打赏
  • 举报
回复
LZ高人啊
fengyizi 2008-06-07
  • 打赏
  • 举报
回复
经测试,vc6.0下不能通过第二个。
加载更多回复(78)

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧