《编程修养》是一篇很早就在网上流传的文章,主要是写给C程序员的一篇关于编码技巧和陷阱的文章。不过C和C++的关联十分紧密,一些技巧和陷阱同样适用于C++程序员。
下面列出我个人觉得比较有趣的几个技巧:
1. 关于注释代码的方法。
大家都知道无外乎“//”和“/**/”吧。这里还介绍了一种比较另类的注释方法就是使用“#if 0 和#endif”把代码包起来。
“//”的优势是比较灵活,但对于多行使用起来很麻烦。
“/**/”的优势是可以一次注释多行,但不能嵌套。
“#if 0 和#endif”的优势是可以一次注释多行,而且可嵌套,但可读性不是很好(个人观点)。
2. 关于宏的使用。
宏只是一种定义,他定义了一个语句块,当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。
看看下面两个宏的定义吧。
#define MAX(a, b) a>b?a:b
#define MAX( (a), (b) ) (a)>(b)?(a):(b)
看起来没什么区别,但如果这样调用宏你将发现有着很大的区别 MAX(1+1, 2+2) 宏展开的结果如下。
1+1>2+2?1+1:2+2
(1+1)>(2+2)?(1+1):(2+2)
所以,一些有经验的程序员都不会建议用宏来代替函数的除非你被逼到万不得已。毕竟看过鬼还不怕黑吗。
3. 关于static的使用
在C中如果一个函数或是一个全局变量被声明为static,那么,这个函数和这个全局变量,将只能在这个C文件中被访问,如果别的C文件中调用这个C文件中的函数,或是使用其中的全局(用extern关键字),将会发生链接时错误。这个特性可以用于数据和程序保密。
4. 关于||和&&的语句执行顺序
express1 || express2
先执行表达式express1如果为“真”,express2将不被执行,express2仅在express1 为“假”时才被执行。因为第一个表达式为真了,整个表达式都为真,所以没有必要再去执行第二个表达式了。
express1 && express2
先执行表达式express1如果为“假”,express2将不被执行,express2仅在express1 为“真”时才被执行。因为第一个表达式为假了,整个表达式都为假了,所以没有必要再去执行第二个表达式了。
5. 关于用for而不是while做循环
首先,for循环的初始、结束条件、循环的推进,都在一起,一眼看上去就知道这是一个什么样的循环。
其次,for(;;) 比 while(1) 运行起来的执行速度要快。
6. 关于sizeof类型而不是变量
sizeof变量只适用于静态分配的数组,而不适用于动态分配的指针。所以尽量用sizeof(类型)。
以上均是个人觉得容易被程序员忽视的地方。希望其他同人能够给予补充和修正,使这篇文章的价值不断提升。