编程一句话技巧(不断更新)

1.当看到这样一句指令mallov(strlen(str));,几乎就可以认为它是错误的,而mallov(strlen(str + 1));才是正确的,因为大家总是会忽略字符串结尾的'/0'字符

 

2.ANSI字符中零的位模式被称为'NUL',用于结束一个ACSⅡ字符串,很多人都不知道哦

 

3.switch语句中的case后面只能跟常量值或常量表达式,const都不可以,因其依旧是变量

 

4.break statement within loop or switch,别指望break可以跳出别的什么东西哦

 

5.ANSI C引入了一个新特性是相邻的字符串常量将被自动合成一个字符串常量,这就省掉了过去在书写多行信息时必须在行末加接续符'/'的做法,但这种自动合并意味着字符串数组初始化时,如果一不小心漏了一个逗号,编译器是不会给错误信息的,而这将发生悲剧……

 

6.C语言中对符号static的重载:在函数内部,表示该变量的值在各个调用间一直保持延续性,在函数这一级,表示该函数只对本文件可见

 

7.sizeof是32个关键字之一,而不是函数,当其操作数是变量的话,两边不需要加括号

 

8.逗号表达式的结果用于赋值一定要加括号,比如i = 1,2;事实上相当于(i = 1),2;

 

9.形如x = f() + g() * h();唯一可以确定的就是乘法会在加法之前执行,至于这3个函数哪个先执行,哪个后执行,是未定义的

 

10.在函数调用中,各个参数的计算顺序是不确定的

 

11.反斜杠作为接续符'/'时,在本行其后面不能再有任何字符,空格都不行

 

12.'//'该符号作为注释符使用是C++的事,但C99也引入了,所以

     a//*

     //*/b

    这段代码在老版本的C用是a/b,但在C99和C++中已经是a了

 

13.结构中也允许存在位段、无名段以及字对齐所需的填充字段。位段的类型必须是int,unsigned int或signed int(或加上限制符)。至于int位段的值可以可以取负值则取决于编译器。                                       

 

14.int型变量i跟只包含一个int型成员的结构变量s在参数传递时的方式可能完全不同,一个int型参数一般会被传递到寄存器中,而结构参数很可能被传递到堆栈中

 

15.枚举相比#define有一个优点,#define定义的名字一般在编译时被丢弃,而枚举名字则通常一直在调试器中可见,可以在调试代码时使用它们

 

16.可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做

 

17.如果函数库的一份拷贝是可执行文件的物理组成部分 ,那么称之为静态链接

     如果可执行文件是包含了文件名,让载入器在运行时能够寻找程序所需要的函数库,那么称之为动态链接

18.使用interpositioning需要格外小心。很容易发生自己代码中某个符号的定义取代函数库中的相同符号的意外。不仅自己所进行的所有对该库函数的调用将被自己版本的函数调用所取代,而且所有调用该库函数的系统调用也将用该函数取而代之。当编译器注意到库函数被另一个定义覆盖时,它通常不会给出错误信息。这也是遵循C语言的设计哲学,即程序员所做的都是对的。

 

 

不断更新中……

posted @ 2010-09-22 11:55  云说风轻  阅读(328)  评论(0编辑  收藏  举报