自从推出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