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