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

news2024/11/19 7:24:21

一、#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.coloradmin.cn/o/11185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全解消能减震神器之“黏滞阻尼器”(上)

导读&#xff1a; 在我国&#xff0c;被动减震装置得到广泛应用&#xff0c;不仅在高层建筑、加上最近还实施颁布了工程抗震管理条例。目前减震构件及结构类型的组合已有诸多形式&#xff0c;今后随着其性能方面、经济方面及设计创意等方面的改进&#xff0c;可以想象会进一步…

大学生抗击疫情感动人物最美逆行者网页设计作业 html抗疫专题网页设计 最美逆行者网页模板 致敬疫情感动人物网页设计制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]计算机毕业设计JAVA电子交易平台

[附源码]计算机毕业设计JAVA电子交易平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

百数新应用——生产制造信息化管理实用工具

运营自动化是企业信息化的基础&#xff0c;决策智能化是企业信息化的顶峰。尤其是对于中小型企业来说&#xff0c;成功的实施信息化策略对于参与国际市场的竞争具有重要的意义。 百数生产制造管理应用以生产制造管理为核心&#xff0c;功能包括产品结构设置&#xff08;BOM&am…

使用 Docker 和 Traefik 搭建轻量美观的计划任务工具

在《轻量的定时任务工具 Cronicle&#xff1a;前篇》这篇文章中&#xff0c;我们聊过如何通过容器封装 Cronicle 这个已经迭代了七年之久的轻量计划任务工具。 本篇文章中&#xff0c;我们来聊聊如何将它和 Docker 以及 Traefik 一起搭配使用。 写在前面 Cronicle 是一款很棒…

PyQt5 使用QSqlDatabase连接Mysql数据库时Driver not loaded Driver not loaded

相关版本说明&#xff1a; python版本&#xff1a;Python 3.6.5 PyQt5版本&#xff1a;PyQt5 5.11.3 PyQt5 5.11.3 是有 qsqlmysql.dll 的 但是连接mysql数据库时&#xff0c;还是提示 Driver not loaded Driver not loaded 算往下看 直接上代码和图片 from PyQt5.QtSql im…

啥?你不知道Lucene,这份高级学习文档你值得拥有

最近在项目中用到了solr&#xff0c;查阅资料知道solr是基于Lucene实现了。本着刨根问底的精神&#xff0c;来研究一下Lucene 啥是Lucene? Lucene是apache下的一个开源的全文本搜索引擎包。他为开发人员提供了一个简单工具包&#xff0c;以方便在目标系统中实现全文本搜索的…

JAVA基础——【笔记】14.集合

集合的框架体系&#xff1a; List等接口的实现子类有很多&#xff0c;仅列出常用的。 数组的不足&#xff08;集合需求的出现&#xff09;&#xff1a; 集合特点&#xff1a; 一、Collection接口方法 1、Collection常用方法及其用法&#xff1a; (Collection为接口&#xff0…

C语言:二维数组的传递

目录 一、从本质了解二维数组 二、访问二维数组的方式 1、指向元素的指针 2、指向每一行的指针&#xff08;指针数组&#xff09; 3、指向整个数组的指针&#xff08;数组指针&#xff09; 三、3种二维数组的形参声明方式 1、数组法 2、数组指针法 3、指针法 在实践工程项目中&…

【数据结构笔记5】-哈夫曼树

哈夫曼树 结点的权&#xff1a;有某种显示含义的数值&#xff08;如&#xff1a;表示结点的重要性等&#xff09; 结点的带权路径长度&#xff1a;从树的根到该结点的路径长度&#xff08;经过的边数&#xff09;与该节点上权值的乘积。 数的带权路径长度&#xff1a;树种所有…

人工智能如何赋能智能安防落地?

作为当下最热门的技术&#xff0c;人工智能基本覆盖了所有的行业&#xff0c;也开始成为了安防行业的“大金矿”。 人工智能赋能安防行业的确是好事&#xff0c;但技术同质化、产品同质化等问题开始凸显出来&#xff0c;并显得越发严重。人工智能将以怎样的新姿态赋能智能安防落…

广东长荣科技有限公司-Java笔试题

Java工程师笔试题目&#xff08;限30分钟完成&#xff09; 一、请参考图片回答以下问题。 二、如何理解面向对象编程&#xff1f; 三、String s new String("Hello");s s " world!";这两行代码执行后&#xff0c;内存是如何变化的&#xff1f; 四、…

ASEMI代理力特二极管LSIC2SD120A05,肖特基LSIC2SD120A05

编辑-Z 力特碳化硅肖特基二极管LSIC2SD120A05参数&#xff1a; 型号&#xff1a;LSIC2SD120A05 重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1200V 连续正向电流&#xff08;IF&#xff09;&#xff1a;5A 非重复正向浪涌电流&#xff08;IFSM&#xff09;&…

Java#7(this关键字和构造方法)

目录 一.就近原则和this关键字 二.构造方法 1.构造方法的格式: 2.构造方法的特点: 有参构造和无参构造​编辑 三.标准的Javabean类 一.就近原则和this关键字 func里的age离System.out.println(age);比较近,所以输出的是10;这就是就近原则,但如果我想使用的是成员变量age前…

OceanBase 首席科学家阳振坤博士入选2022 年度“CCF王选奖”

11 月 14 日&#xff0c;2022 年度“CCF王选奖” 评选结果公布&#xff0c;蚂蚁集团副总裁、 OceanBase 首席科学家阳振坤博士 入选。 “CCF王选奖” 由中国计算机学会&#xff08;简称 CCF&#xff09;设立于 2005 年&#xff0c;以我国著名计算机科学家王选先生命名&#…

高精度定时器学习(通过官方手册学习)

高精度定时器学习功能描述一般说明HRTIM引脚和内部信号时钟Timer A..E timing units翻转事件功能描述 一般说明 HRTIM可以划分为几个模块&#xff1a; •主定时器 •计时单元&#xff08;定时器A至定时器E&#xff09; •输出级 •突发模式控制器 •所有定时器共享的外部事件…

Android核心技术—内核(Linux) 的IO栈

简述 Linux的IO路径可能是Linux系统中最纷繁复杂的模块了&#xff0c;而它又是如此的重要&#xff0c;直接决定了系统的性能。 接下来我们来看一张熟悉的老图&#xff1a; 由图可见&#xff0c;从系统调用的接口再往下&#xff0c;Linux下的IO栈致大致有几个层次&#xff1a…

【Spring】——3、自定义TypeFilter指定@ComponentScan注解的过滤规则

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

Java中的IO流

Java中的IO流 Java中的4大IO抽象类 InputStream/OutputStream 为字节输入输出流 Reader/Writer 为字符输入输出流 InputStream OutputStream Reader Writer Java中流的概念细分 二进制文件&#xff08;图片、影音&#xff09;用字节流 文本信息用字符流 IO流的体系 练手案例…

HTML入门

目录1 HTML快速入门1.1 HTML 的介绍1.1.1 HTML 的组成标签属性1.2 入门案例1.2.1 案例效果1.2.2 实现步骤1.3 总结2 HTML 基本语法2.1 HTML 的注释2.2 HTML 标签2.3 HTML 的属性2.4 HTML 的特殊字符3 HTML 案例 新闻文本3.1 案例效果3.2 案例分析3.2.1 div 样式布局3.2.2 文本标…