您真的会用switch吗?

C语言的理念,程序员应该知道自己正在干什么,而且保证自己的所作所为是正确的。

switch知多少

各个case和default的顺序可以是任意的,但习惯上总是default在最后。

标准的C编译器允许一条switch有257个case标签,这是为了允许switch满足8bit字符的所有情况。

switch内部的任何语句都可以加上标签,并可在执行时跳转。

switch也有个缺点,就是不会在每个case执行完后自动终止,且会依次执行后面的case。所以学习C语言的时候老师告诉我们,必须每个case都加break结束,以此改变缺省行为。

switch中的break中断了什么?

不要忘了break语句事实上跳出的是最近的那层循环语句或switch语句。而这里程序员的意图是跳出case1中的if语句块,但明显事与愿违。

使一段代码第一次执行时的行为与以后执行时不同

在实际业务编程中,经常会遇到第一次执行和后续执行使用不同分隔符或类似情况。这个例子应该能提供一些思路,给予一些启发。

generate_initializer(char* string){

static char separator = ' ';

printf("%c %s\n", separator, string);

separator = ',';

}

缺省可见性

定义的C函数,在缺省情况下是全局可见的。

function apple(){/*在任何地方都可见该函数*/}

extern function peer(){/*在任何地方都可见该函数*/}

static function orange(){/*只在当前文件可见该函数*/}

事实上,几乎所有人都没有在函数名前添加存储类型说明的习惯,所以绝大多数函数是全局可见。根据实际经验,这种缺省的全局可见性被证明是个错误。软件对象在大多数情况下应该缺省是有限可见性,而当程序员需要让它全局可见时,应采用显式的手段。而实际编程中,需要全局可见的对象也是占非常少数。

符号重载

static符号

在函数内部表示该变量的值在各个调用间一直保持延续性

在函数这一级,表示该函数只对本文件可见

void符号

作为函数的返回类型,表示不返回任何值

在指针声明中,表示通用指针类型

位于参数列表,表示没有参数

&符号

位的AND操作符

取地址操作符

类似的还有许多。仅增加、删除或修改一个字符就会使原先的程序变成另外一

个仍然有效却全然不同的程序。

p = N * sizeof * q;

/*这里是一个乘号还是两个?答案是只有一个,sizeof会把*q作为操作数*/

apple = sizeof(int) * q;

/*这里是什么意思?是整型的大小乘以q,还是把q指向的类型强换为整型然后进行sizeof*/

要想成为熟练的程序员,必须要自己编写测试程序探索这个问题。试试吧~

"有些运算符的优先级是错误的"

.的优先级高于*: *p.f的效果等于*(p.f),而用->可以消除这个影响。

==和!=高于位操作符: (val & mask != 0) 等效于 (val & (mask != 0))。

==和!=高于赋值符:(c = getchar() != EOF) 等效于 (c = (getchar() != EOF))

算术运算符高于移位运算符:(msb

逗号运算符在所有运算符中优先级最低:i = 1, 2 等效于 (i = 1), 2。

在不确定的情况下,还是在适当地方用括号进行保护比较好。莫走钢丝绳,自己坑自己。

对于一些不合理的运算符优先级,从安全的角度出发,不能做修改,否则的话当时现有的大量代码都有可能出问题。

有专家建议在C语言中牢记两个优先级就够了:乘法和除法先于加法和减法,在涉及其他的操作符时一律加上括号。

本文来自企鹅号 - 程序猿GGang媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

Google C++编程风格指南(四)之类的相关规范

类是C++中基本的代码单元,自然被广泛使用。本节列举了在写一个类时要做什么、不要做什么。

762
来自专栏java学习

面试题44(关于异常处理机制的叙述正确的是?)

关于异常处理机制的叙述正确的是? ---- A catch部分捕捉到异常情况时,才会执行finally部分 B 当try区段的程序发生异常时,才会执行final...

2734
来自专栏zhisheng

运算优先级、结合性、求值顺序、副作用和顺序点

标题中这几个概念,是很多C/C++程序员在表达式上容易出问题或不清楚的地方,虽然这些概念在很多语言都有体现,但C里面特别明显,所以就以C语言为例子总结下 运算...

4097
来自专栏Golang语言社区

Golang语言--细节汇总

slice和数组在声明时的区别:声明数组时,方括号内写明了数组的长度或使用...自动 计算长度,而声明slice时,方括号内没有任何字符。 对于slice有几个...

3539
来自专栏机器学习从入门到成神

海量数据处理之Bti-map详解

    所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以...

521
来自专栏Python小屋

Python标准库collections中与字典有关的类

Python标准库中提供了很多扩展功能,大幅度提高了开发效率。这里主要介绍OrderedDict类、defaultdict类和Counter类。 (1)Orde...

2636
来自专栏程序员互动联盟

【今日问题】变量未初始化引起的崩溃

昨天写的今日问题,有小伙伴给我反馈,觉得挺有用,小编今天继续给小伙伴们总结遇到的常见问题 一、初学者经常由于没有养成良好的编程习惯,未初始化变量会引起那些问题 ...

2706
来自专栏Java帮帮-微信公众号-技术文章全总结

Java对象结构【面试+工作】

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。下...

624
来自专栏ShaoYL

OC内存管理

3529
来自专栏python 实践经验

python面试题目解析--iterator考察点和list考察点

为什么会是这个结果呢? 我们首选需要了解Python的一个循环机制:Python中的for循环实质是一个迭代器iterator,它不断调用next方法返回下一...

1363

扫码关注云+社区