自從推出const,就建議用它代替無參數的宏來定義常量。
【例7.1】下面的程序設計使用了宏定義,找出錯誤的地方。
#include <stdio.h> #define NUM =3 void main () { int i ,sum=0 ; for (i=NUM ;i>0 ;i-- ) { sum++ ; printf ("%d :Welcome !\n" ,sum ); } }
由於定義時多了一個「=」號,所用NUM變成「=3」,for語句的替代變成
for (i==3 ;i>0 ;i-- )
賦值符「=」變成比較符「==」,編譯系統會給出出錯信息。
現在不建議使用宏定義常量,推薦使用const。
#include <stdio.h> int const NUM =3 ; void main () { int i ,sum=0 ; for (i=NUM ;i>0 ;i-- ) { sum++ ; printf ("%d :Welcome !\n" ,sum ); } }
運行結果如下。
1 :Welcome ! 2 :Welcome ! 3 :Welcome !
像這類程序,如果只是主函數使用它,更推薦在程序中定義。例如:
#include <stdio.h> void main () { int const NUM=3 ; int i ,sum=0 ; for (i=NUM ;i>0 ;i-- ) { sum++ ; printf ("%d :Welcome !\n" ,sum ); } }
【例7.2】分析下面程序的錯誤及其輸出結果。
#include <stdio.h> #define P1 5 #define P2 15 #define PP P1+P2 #define SIDE 25 #define AREA PP*SIDE void main () { printf ("The area is %d\n" ,AREA ); }
C語言的編譯器不能理解宏定義裡的語法,即不理解這裡的加運算,所以只能把它定義為「5+15」,替代後成為
#define AREA 5+15*25
所以輸出是380。應該將它們括起來,即正確的定義為
#define PP (P1+P2 )
或者使用const定義為
int const PP=P1+P2 ;
const可以為表達式,從而輸出如下的正確結果「The area is 500」。
const的用處不僅僅是在常量表達式中代替宏定義。如果一個變量在生存期中的值不會改變,就應該用const來修飾這個變量,以提高程序的安全性。
【例7.3】有人說下面的程序輸出是1350,原因是宏定義是30*45=1350。對嗎?
#include <stdio.h> int const SIDE=30 ;int HIGHT=45 ; #define AREA SIDE*HIGHT void main () { HIGHT=90 ; printf ("The area is %d\n" ,AREA ); }
不對。在執行printf之前,已經修改了HIGHT的值,所以輸出為
2700
如果將上面的程序修改為如下程序:
#include <stdio.h> int const SIDE=30 ,HIGHT=45 ; #define AREA SIDE*HIGHT void main () { printf ("The area is %d\n" ,AREA ); }
程序輸出:
1350
【例7.4】分析下面的程序不能通過編譯的原因。
#include <stdio.h> #define SIDE 15 , HIGHT 30 #define AREA SIDE*HIGHT void main () { printf ("The area is %d\n" ,AREA ); }
在程序中,可以用一種數據類型在一行中定義多個同類型的變量。例如下面的定義
int const SIDE=30 ,HIGHT=45 ;
是正確的,SIDE和HIGHT都是整型常量,但宏定義一行只允許定義一個,所以定義
#define SIDE 15 , HIGHT 30
是錯誤的。如果是下面的定義形式:
#define CH "AB" "CD" "EFG"
則CH的值變為字符串ABCDEFG。
可用下面的程序驗證它們的用法。
#include <stdio.h> #define SIDE 15 #define HIGHT 30 #define AREA SIDE*HIGHT #define CH "AB" "CD" "EFG" void main () { printf ("The area is %d.\n" , AREA ); printf (CH );printf ("\n" ); }
程序輸出結果如下。
The area is 450. ABCDEFG