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

这篇具有很好参考价值的文章主要介绍了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;
}

运行结果:
C语言之#define用法入门详解
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;
}

运行结果:
C语言之#define用法入门详解
3.定义字符串常量
参考代码:

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

运行结果:
C语言之#define用法入门详解
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;
}

运行结果:
C语言之#define用法入门详解
三、#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带有运算符的常数之间的运算需要注意符号常量不要重名。文章来源地址https://www.toymoban.com/news/detail-497394.html

到了这里,关于C语言之#define用法入门详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 基本概念 基础用法 增删改查(特殊查询)语法 详细篇

    今天来分享一期MySQL的基本用法(增删改查 对库 对表 对值) 目录 MySQL的基础概念  SQL 语言的主要分类 DDL(数据定义语言) DML(数据操控语言) DQL(数据库查询语言) DCL(数据库控制语言) 基础语法 增 库的操作 表操作 列操作 值操作 删 删除库 删除表 删除值 改 修改表名 更新数

    2024年03月16日
    浏览(37)
  • 【C语言】预处理详解:#define的各种使用方法

    目录 1.#define定义标识符 1.1赋值 1.2   定义 1.3用更形象的符号来替换一种实现 1.4   加续行符换行 1.5#define定义宏 1.6  #define替换的规则 注意事项 2.#和## 3.带有副作用的宏参数 4.函数和宏的对比 #define定义标识符的用法非常简单 name可以由自己来命名,尽量取一些有意义

    2024年02月15日
    浏览(30)
  • 【C++语言1】基本语法

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖         这篇博客是一个新的开始——学习C++语言,众

    2024年01月24日
    浏览(39)
  • C语言——指针基本语法

    内存地址 在计算机内存中,每个存储单元都有一个唯一的地址(内存编号)。 通俗理解,内存就是房间,地址就是门牌号 指针和指针变量 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。 指针的实质就是内存“地址” 指针变量就是存储这个地址的变量。 指针作用

    2024年02月10日
    浏览(45)
  • 【docker常用命令系列】Docker Build语法用法示例详解

    Docker Build是Docker提供的一个命令,用于根据Dockerfile构建自定义的镜像。通过Docker Build,可以将应用程序、环境和依赖项打包到一个可移植的容器中,使得应用在不同环境下都能以相同的方式运行。 docker build [OPTIONS] PATH | URL | - 是 docker build 命令的语法说明。下面解释每个部分

    2024年04月14日
    浏览(25)
  • Python入门教程 - 基本语法 (一)

    目录 一、注释 二、Python的六种数据类型 三、字符串、数字 控制台输出练习 四、变量及基本运算 五、type()语句查看数据的类型 六、字符串的3种不同定义方式 七、数据类型之间的转换 八、标识符命名规则规范 九、算数运算符 十、赋值运算符 十一、字符串扩展 11.1 转义字

    2024年02月10日
    浏览(27)
  • Go语言的基本概念与语法

    每个 Go 程序都是由包组成的. 程序从 main 包开始运行. 本程序通过导入路径 \\\"fmt\\\" and \\\"math/rand\\\" 来使用这两个包. 按照约定,包名与导入路径的最后一个元素相同。例如, \\\"math/rand\\\" 包中的源码均以 package rand` 语句开始. 注意: 执行这些程序的环境是确定性的 所以每次运行示例程序

    2024年02月11日
    浏览(40)
  • 鸿蒙HarmonyOS实战-ArkTS语言(基本语法)

    🔎1.简介 HarmonyOS的ArkTS语言是一种基于TypeScript开发的语言,它专为HarmonyOS系统开发而设计。ArkTS语言结合了JavaScript的灵活性和TypeScript的严谨性,使得开发者能够快速、高效地开发出高质量的HarmonyOS应用程序。 ArkTS语言具有以下特点: 静态类型检查:开发者在编写代码时可以

    2024年01月18日
    浏览(45)
  • Elasticsearch从入门到精通-03基本语法学习

    👏作者简介:大家好,我是程序员行走的鱼 📖 本篇主要介绍和大家一块学习一下ES基本语法,主要包括索引管理、文档管理、映射管理等内容 ES对数据进行增、删、改、查是以Restful方式对服务端发送请求的,所以在我们学习基本语法之前先了解一下Restful是什么? REST 指的是一

    2024年03月15日
    浏览(35)
  • 【FPGA入门】第一篇、Verilog基本语法常识

    目录 第一部分、不同的变量类型 1、wire和reg的区别  2、如何对变量进行赋值呢? 3、什么是阻塞?什么是非阻塞? 第二部分、变量位宽的定义 1、各种系统默认情况 2、变量位宽声明方式 3、表明位宽的情况下,赋值方式 4、两个模块之间例化,不定义变量直接用的方式 5、常

    2024年02月04日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包