您真的会用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 条评论
登录 后参与评论

相关文章

来自专栏分布式系统和大数据处理

四种简单的排序算法

我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF、Asp.Net MVC、AJAX等,熟练应用一些已经比较成熟的技术,比如Asp.N...

16920
来自专栏Phoenix的Android之旅

说一个小bug

这个bug其实很简单,因为String是不可变内容的,想获得新值,必须重新赋值。正确应该是

11030
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(String专栏)

Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

14630
来自专栏北京马哥教育

这段代码很Pythonic | 相见恨晚的 itertools 库

18830
来自专栏Java学习网

Java 8的函数式编程学习

Java 8的函数式编程学习 函数式编程语言是什么? 函数式编程语言的核心是它以处理数据的方式处理代码。这意味着函数应该是第一等级(First-class)的...

28470
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(String专栏)

Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

14820
来自专栏用户2442861的专栏

sizeof小览

http://blog.csdn.net/scythe666/article/details/47012347

9810
来自专栏恰童鞋骚年

你必须知道的指针基础-3.指针的移动及指针的危险

  指针每次加一就是指针向前移动指针类型对应的字节数。下面通过一个int指针来指向一个int数组,看看指针的加法运算到底是个什么鬼?

10820
来自专栏CodingBlock

Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析

前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次、商城商品销量排名、新闻的搜索热度排名等等。也正因为排序的应用范围如此之广...

31890
来自专栏绿巨人专栏

学习Scala: 初学者应该了解的知识

31540

扫码关注云+社区

领取腾讯云代金券