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

相关文章

来自专栏葡萄城控件技术团队

5分钟掌握var,let和const异同

这个话题对于一些老鸟来说可能根本算不上疑问,但对于新手来说也许除了最常见的var之外,let和const较少使用的机会。

754
来自专栏非著名程序员

鸡蛋问题来了,是先有Class还是先有Object?

周末比较无聊,在浏览论坛的时候,偶然看到一个程序猿提问的问题,他时这样提问的:突然想到一个很菜的问题, 倒底先有Object还是先有Class?所有类都是Obj...

1836
来自专栏Crossin的编程教室

【Python 第52课】 元组

上一次pygame的课中有这样一行代码: x, y = pygame.mouse.get_pos() 这个函数返回的其实是一个“元组”,今天我们来讲讲这个东西。...

3217
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第六章 Kotlin 函数式编程(FP)第六章 Kotlin 函数式编程(FP)1. 函数式编程概述2. Kotlin函数式编程参考资料

从本质上来说, 程序就是一系列有序执行的指令集合。 如何将指令集合组织成可靠可用可信赖的软件(美妙的逻辑之塔), 这是个问题。

986
来自专栏一个会写诗的程序员的博客

React极简教程: Hello,World!React简史React安装Hello,World

A programming paradigm is a fundamental style of computer programming. There are...

741
来自专栏小樱的经验随笔

【Java学习笔记之三十一】详解Java8 lambda表达式

Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动。特性之一便是随同发布的lambda表达式,它将允许...

3275
来自专栏闰土大叔

闰土说JS进阶之变量

前言 前端世界如此喧嚣,能进阶的何其稀少。大家好,你们的闰土哥在沉寂了数月之后又回来了!(此处应有掌声~~~) 前段时间在群里关于“闰土去哪儿了”的话题,让我既...

32710
来自专栏逸鹏说道

【推荐】C#线程篇---Task(任务)和线程池不得不说的秘密(5.1)

在上篇最后一个例子之后,我们发现了怎么去使用线程池,调用ThreadPool的QueueUserWorkItem方法来发起一次异步的、计算限制的操作,例子很简单...

3875
来自专栏小樱的经验随笔

getline函数(精华版)

在我的印象中,getline函数经常出现在自己的视野里,模糊地记得它经常用来读取字符串 。但是又对它的参数不是很了解,今天又用到了getline函数,现在来细细...

2834
来自专栏sunseekers

初探 TypeScript函数基本类型泛型接口类内置对象

前段时间有朋友和我推荐 TypeScript ,他说写起来特别爽,让我去试一试,那时候我还在那是啥高深莫测的东西。刚好那段时间忙,一直没有时间看。最近也很忙,还...

732

扫码关注云+社区