| |
很多人写代码是照猫画虎,这些“猫”最终就变成了教条(注1)。一旦教条被人熟知,不同的变量,数值,功能就被按照教条使用,然后用一些“胶水”代码组合起来,实现需要的方案。通过对语法的深入了解,我们可以消除很多的“胶水”。这篇文章举了几个怪异的C语法的例子,以及如何在不导致歧义(注2)的情况下,利用(滥用?)他们实现更高效的代码。
记得返回值
我的第一个关于“教条编程”的例子将讨论格式化输出函数sprintf。下面这段代码的写法并不鲜见: sprintf(str1, "Old v=%dt",v); /* Some code that plays with v */ sprintf(str2, "New v=%d",v); strcat(str1, str2); printf(str1);
大部分的sprintf实例使用一个临时的字符串变量作为它的第一个参数。这就是那个根深蒂固的教条:“sprintf需要一个临时字符串”。然而更好的教条是符合语法的,“sprintf需要一个指向字符数组的指针”。这提醒我们,可以用一个返回char *的函数替代它作为第一个参数,从而节省一个临时缓冲区的空间。例如: sprintf(str, "Old v=%dt",v); /* Some code that plays with v */ sprintf(strchr(str, ' |