映月读书网 > C语言解惑 > 7.1 用const代替无参数的宏定义 >

7.1 用const代替无参数的宏定义

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