两则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/
...全文
1011 98 打赏 收藏 转发到动态 举报
写回复
用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)
C语言是一门广泛应用于系统编程、嵌入式软件和高性能应用开发的高级编程语言。本课程旨在向你介绍C语言的基本概念、语法和编程技巧,使你能够掌握C语言的核心知识,并能够用C语言编写简单到中等复杂程度的程序。课程针对0基础初学者,所以课程会由浅入深,由表及里的探索C语言知识框架,慢慢触及C语言本质,课程结构先由简单程序引入,然后拆分程序各个细节,让你逐渐掌握C语言编程的精髓。也会讲解C语言编译过程,怎样将人类描述的语言让计算机能够识别并按我们的意愿运行。C语言程序怎样运行也会详细介绍,了解程序由静到动的过程。课程注重基础理论与实践结合,在重点关注C语言的基础理论知识的同时,我们会结合大量的实际编程练习,对每个重要的知识点和易错的地方都有代码演示并查看程序运行结果,深入理解C语言的运作原理。课程中一半内容是理论知识的讲解,另外一半是代码实操。课程由本人全部从0开始编写,从课程架构思考,内容组织,难易程度,章节划分,都融入了本人对C语言的思考,几乎全是干货,如果你渴望成为一名优秀的C语言编程者,那么不要犹豫!欢迎报名参加我们的课程,让我们一起踏上编程的旅程,共同学习和进步!课程源码:https://gitee.com/sliaowalker/c-language-programming

33,311

社区成员

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

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