C语言之#define用法入门详解

一、#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带有运算符的常数之间的运算需要注意符号常量不要重名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/214593.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python Flask为女朋友做一个简单的网站(附可运行的源码)

&#x1f31f; 所属专栏&#xff1a;献给榕榕 &#x1f414; 作者简介&#xff1a;rchjr——五带信管菜只因一枚 &#x1f62e; 前言&#xff1a;该专栏系为女友准备的&#xff0c;里面会不定时发一些讨好她的技术作品&#xff0c;感兴趣的小伙伴可以关注一下~ &#x1f449; 文…

Jetson orin(Ubuntu20.04)不接显示器无法输出VNC图像解决办法以及vnc安装记录

sudo apt install vino 好像Jetpack 5.0中已经自带了。。 配置VNC server: gsettings set org.gnome.Vino prompt-enabled false gsettings set org.gnome.Vino require-encryption false 编辑org.gnome,增加一个“enabled key”的参数&#xff1a; cd /usr/share/glib-2…

机器学习第13天:模型性能评估指标

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 交叉验证 保留交叉验证 k-折交叉验证 留一交叉验证 混淆矩阵 精度与召回率 介绍 精度 召回率 区别 使用代码 偏差与方差 介绍 区…

现货黄金区间交易的两个要点

在现货黄金市场中&#xff0c;我们常碰到横盘区间行情。有区间&#xff0c;就终究会出现突破&#xff0c;因为金价不可能缺乏方向而一直在区间内运行。那既然要突破&#xff0c;我们又应当如何应对和交易呢&#xff1f;下面我们就来讨论一下。 切忌在突破发生时马上跟随突破方向…

前装标配搭载率突破30%,数字钥匙赛道进入「纵深战」周期

在汽车智能化进程中&#xff0c;作为传统高频应用的车钥匙&#xff0c;也在加速数字化升级。同时&#xff0c;在硬件端&#xff0c;从蓝牙、NFC到UWB等多种通讯方式的叠加效应&#xff0c;也在大幅度提升数字钥匙的用户体验。 目前&#xff0c;部分市场在售车型&#xff0c;车企…

2023-11-24 LeetCode每日一题(统计和小于目标的下标对数目)

2023-11-24每日一题 一、题目编号 2824. 统计和小于目标的下标对数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你返回满足 0 < i < j < n 且 nums[i] nums[j] < targe…

GWAS结果批量整理:升级版算法TidyGWAS

TidyGWAS GWAS分析关键结果之一是显著性SNP位点的P值&#xff0c;通常多年份多地点多模型的GWAS分析将会产生很多结果文件&#xff0c;如何对这些数据进行整理&#xff1f; 汇总这些结果&#xff0c;并将显著性的位点或区域找出来&#xff0c;更加清晰的展示关键信息。 今天介…

微服务学习|初识MQ、RabbitMQ快速入门、SpringAMQP

初识MQ 同步通讯和异步通讯 同步通讯是实时性质的&#xff0c;就好像你用手机与朋友打视频电话&#xff0c;但是&#xff0c;别人再想与你视频就不行了&#xff0c;异步通讯不要求实时性&#xff0c;就好像你用手机发短信&#xff0c;好多人都能同时给你发短信&#xff0c;你…

广州华锐互动:AR可视化展示昆虫让教学过程更直观生动

随着科技的不断发展&#xff0c;AR&#xff08;增强现实&#xff09;技术已经逐渐走进我们的生活。通过AR技术&#xff0c;我们可以将虚拟的信息叠加到现实世界中&#xff0c;让现实世界变得更加丰富多彩。在这篇文章中&#xff0c;我们将以昆虫为主题&#xff0c;探讨AR增强现…

金蝶云星空和四化智造MES(WEB)单据接口对接

金蝶云星空和四化智造MES&#xff08;WEB&#xff09;单据接口对接 对接系统&#xff1a;四化智造MES&#xff08;WEB&#xff09; MES系统是集成生产管理、品质管理、设备管理、BI数据中心、库存管理、工时管理、数据采集、看板管理等为一体的综合性生产管理系统。通过强调制造…

单片DC-DC变换集成电路芯片B34063,可兼容型号MC34063A。工作电压范围宽。静态电流小,具有输出电流限制功能输出电流保护功能

B34063为一单片DC-DC变换集成电路&#xff0c;内含温度补偿的参考电压源(1.25V)、比较器、能有效限制电流及控制工作周期的振荡器,驱动器及大电流输出开关管等&#xff0c;外配少量元件&#xff0c;就能组成升压、降压及电压反转型DC-DC变换器。 主要特点&#xff1a; ● 工作…

Android 打包aar包含第三方aar 解决方案

Android 打包aar包含第三方aar 因项目需要&#xff0c;打包aar包含第三方aar&#xff0c;如果直接对module进行打包会产生一些问题。 * What went wrong: Direct local .aar file dependencies are not supported when building an AAR. The resulting AAR would be broken be…