一、#define的基本语法

在C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程中,其值不能被改变的量。常量常使用#define来定义。
使用#define定义的常量也称为符号常量,可以提高程序的运行效率。
其常见的用法包括两种,分别是:

1)#define 宏名 宏值
2)#define 宏名(参数列表) 表达式

第一种语法就是定义符号常量,
例如:

#define N 100

此后直到#undef N之前, N的值都是100。当遇到#undef N,其后如果再出现N,则N需要重新定义之后才可以使用。

第二种语法常用来定义符号函数。
例如:

#define AREA(x,y) (x)*(y)

表示用来求长和宽分别是x和y的矩形的面积。
需要注意的是,在表达式(x)*(y)中,x和y都要使用“()”括起来,这是因为符号函数在编译时时进行符号形式替换。如果不加()则可能会发生意想不到的错误,例如:

#define AREA(x,y)  x*y
...
A = AREA( 2+3, 1+2 );

此处预期的结果是15,但是实际的结果却是7,这是因为该段代码在编译进行了简单的符号替换而得到的实际表达式是:

A = 2+3 * 1+2;

根据运算符的优先级,先进行乘法运算,然后才是加法,这就导致了错误。
而如果使用

#define AREA(x,y)  (x)*(y)
...
A = AREA( 2+3, 1+2 );

则在编译时替换的结果是:

A = (2+3) * (1+2);

所以实际运行结果是15。

二、#define使用示例

1.表示静态数组的长度
由于定义数组的基本语法规则是:

类型说明符 数组名[常量表达式];

因此“常量表达式”常常是使用#define定义的常量,例如:
Demo1:从键盘输入指定个数的整数序列,然后计算其数学期望和方差。
参考代码为:

#include"stdio.h"
#define N 10  //定义常量
int main()
{int i, sum, sum2, arr[N] = { 100, 50, 76, 85, 91, 70, 100, 50, 99, 40 };float expn, var;//数学期望,也就是平均值sum = 0;for( i=0; i<N; i++ ) {sum += arr[i];}expn = float(sum) / N;//方差sum2 = 0;for( i=0; i<N; i++ ) { sum2 += (arr[i] - expn) * (arr[i] - expn); } var = float(sum2) / (N-1); printf( "数学期望:%f\n", expn );printf( "方差    :%f\n", var );return 0;
}

运行结果:

2.定义字符常量
Demo2:从键盘输入一组整数,并计算其和。要求遇到’#’则结束输入。
参考代码:

#include"stdio.h"
#define STOPFLAG '#'
int main()
{int data, sum = 0;char ch;printf( "输入整数(最后一个数据后面加#结束):\n" ); while(1){scanf( "%d", &data );sum += data;ch = getchar();if(ch == STOPFLAG ){break;}}printf( " sum = %d\n", sum );return 0;
}

运行结果:

3.定义字符串常量
参考代码:

#include"stdio.h"
#define STRING "Hello World."
int main()
{printf( " %s\n", STRING );return 0;
}

运行结果:

4.定义简单的函数
使用#define定义符号常量函数,且该常量被多次调用,则可以提高程序的运行效率。
Demo4:计算半径R为不同值时圆的面积。
参考代码:


#include"stdio.h"
#define AREA(R) 3.14 * (R) * (R)
int main()
{printf( "R = 1, area = %f\n", AREA(1) );printf( "R = 1+2, area = %f\n", AREA(1+2) );printf( "R = 1+2+1, area = %f\n", AREA(1+2+1) );return 0;
}

运行结果:

三、#define使用注意事项
1.使用#define定义带有运算符的符号常量时,一定要对每个量都加上圆括号,以避免出现不必要的错误。
2.符号常量同名的问题:

以下写法是正确的

#include"stdio.h"
#define PROD 2 * 5
#define PROD 2  *  5
int main()
{printf( "%d", PROD );return 0;
}

但是以下使用#define定义PROD 会提示告警:第三行代码“PROD ”redefiened

#include"stdio.h"
#define PROD 2 * 5
#define PROD 2*5
int main()
{printf( "%d", PROD );return 0;
}

也就是说,使用#define定义重复的符号常量时,如果运算符的前后都有空格,则不提示告警,否会提示告警。因此使用#define带有运算符的常数之间的运算需要注意符号常量不要重名。

C语言之#define用法入门详解相关推荐

  1. C#语言入门详解笔记(9)—P19 委托详解

    C#语言入门详解_哔哩哔哩_bilibiliC#语言入门详解搬运,随youtube上进度更新.刘老师的C#视频教程到30集就告一段落了,感谢刘老师在这5年间的付出.能上youtube的同学可以去刘老师 ...

  2. python语言编程基础-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

  3. python语言入门m-Python语言入门详解!快速学成Python!

    今日主题 "Python语言入门详解" 近两年来,Python语言借着数据科学和人工智能的"东风"成为了最流行的编程语言--街头巷尾人们口口相传.同时,Pyth ...

  4. python语言入门详解-python初级教程:入门详解

    python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...

  5. python语言入门-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

  6. C#语言入门详解笔记(5)—P10、P11、P12 操作符详解_1_2_3

    C#语言入门详解_哔哩哔哩_bilibiliC#语言入门详解搬运,随youtube上进度更新.刘老师的C#视频教程到30集就告一段落了,感谢刘老师在这5年间的付出.能上youtube的同学可以去刘老师 ...

  7. c语言memset函数用法,C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一.函数原形   void *  memset(void*s, int ch,size_t n) 二.函数作用  将以s内存地址为首的连续n个字节的内容置成ch,一 ...

  8. c语言pair的用法,C++ pair的用法实例详解

    C++ pair的用法实例详解 1 pair的应用 pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存.另一个应用是,当 ...

  9. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

最新文章

  1. R语言绘制简单行程图
  2. UDP如何实现可靠传输
  3. 实验一 绘制金刚石图案
  4. 【译】《Understanding ECMAScript6》- 第八章-Module
  5. 从真实项目中抠出来的设计模式——第二篇:过滤器模式
  6. 水晶报表设置图片高度与宽度
  7. 【java】java的unsafe
  8. Codeforces Round #379 (Div. 2) A. Anton and Danik 水题
  9. SQL语句 分页实现
  10. OpenPDF 或 itext5 根据pdf模板生成多页PDF
  11. 读书笔记 - 《资本幕后》
  12. 身份证号码查询-完整提供 Demo 代码示例及数据专业且全面的 API 查询接口
  13. fudannlp java_中文NLP工具
  14. 浪涌保护器,SPD浪涌保护器的分类和选型标准
  15. matlab获取图像某点RGB值、灰度值的方法
  16. Vue中引入和使用animate.css
  17. 想用C++实现一个软件渲染器
  18. 调整oracle服务器时间,那些年Oracle数据库主机时间调整的风花雪月
  19. 传输线的波阻抗与特征阻抗
  20. DataStage_Stage使用

热门文章

  1. tomcat介绍与使用
  2. POJ h0248.海贼王之伟大航路
  3. Android开发——AS插件批量解决XML中的String/Color/Dimen硬编码
  4. web前端测试——e2e测试
  5. 企业在申请专利时如何明确要申请专利的技术点
  6. A query was run and no Result Maps were found for the Mapped Statement ‘xxx‘
  7. 华为 IS-IS中间系统数据包与邻居状态
  8. 安装最新版jupyter和anaconda的一个大坑
  9. 【Linux】nohup执行jar包
  10. 如何避免技术演讲紧张