您真的会用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语言中牢记两个优先级就够了:乘法和除法先于加法和减法,在涉及其他的操作符时一律加上括号。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180103G0OIXK00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区