有时传值的函数实现不了预期的功能,这时可以考虑用宏来定义函数。
【例15.6】假设字符数组buf里存放的是数字字符,编程将数字字符倒序输出。
#include <stdio.h> #define SWAP (a ,b ) {char temp ; temp=b ; b=a ; a=temp ;} void main ( ) { int i=0 , j=0 ; char buf[16] ; gets (buf ); while (buf[i] !='\0' ) i++ ; for (j=0 ;j<i/2 ;j++ ) SWAP (buf[j] ,buf[i-1-j] ); printf (buf ); printf ("\n" ); }
程序输出结果如下。
9876543210 0123456789
其实语句“SWAP(buf[j],buf[i-1-j]);”有两个“;”号,多了一个“;”号不影响结果,因为“;”构成一个空语句。按定义应写成“SWAP(buf[j],buf[i-1-j])”,这样语句尾部就没有“;”号,但会让人咋看起来以为是错误语句,会不由自主地为它增加“;”号。但不管怎样,都不影响程序的正确性。
在有些地方就不这样幸运了,下面是一个简单的if-else结构。
for (j=0 ;j<i/2 ;j++ ) if (i>0 ) SWAP (buf[j] ,buf[i-1-j] ); else printf (" 错误!" );
由于多了一个“;”号,造成语法错误。少写“;”号,又让人觉得不习惯。可以换一种结构解决这个问题。下面是使用do~while结构定义的例子。
#define SWAP (a ,b ) do{ char temp ; temp=b ; b=a ; a=temp ; } while (0 )
因为只需要执行一次,所以用while(0)作为循环条件。这时,如果if语句不写“;”号,就会造成语法错误,这种处理就使它符合了编程习惯。