有时传值的函数实现不了预期的功能,这时可以考虑用宏来定义函数。
【例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");}
程序输出结果如下。
98765432100123456789
其实语句“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语句不写“;”号,就会造成语法错误,这种处理就使它符合了编程习惯。