有時傳值的函數實現不了預期的功能,這時可以考慮用宏來定義函數。
【例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語句不寫「;」號,就會造成語法錯誤,這種處理就使它符合了編程習慣。