C语言进阶课程学习记录- 函数与宏分析

news/2024/9/24 13:15:38/

C语言进阶课程学习记录- 函数与宏分析

    • 实验-宏和函数
    • 实验-宏的副作用
    • 实验-宏的妙用
    • 小结

本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课程PPT,仅用于个人学习记录

在这里插入图片描述
在这里插入图片描述

实验-宏和函数

#include <stdio.h>#define RESET(p, len)          \while( len > 0 )           \((char*)p)[--len] = 0void reset(void* p, int len)
{while( len > 0 )((char*)p)[--len] = 0;
}int main()
{int array[] = {1, 2, 3, 4, 5};int len = sizeof(array);int i = 0;for(i=0; i<5; i++){printf("array[%d] = %d\n", i, array[i]);}//reset(array, len);//case1RESET(array, len);//case2for(i=0; i<5; i++){printf("array[%d] = %d\n", i, array[i]);}return 0;
}/*output:
array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
array[4] = 5
array[0] = 0
array[1] = 0
array[2] = 0
array[3] = 0
array[4] = 0*/

在这里插入图片描述

实验-宏的副作用

#include <stdio.h>#define _ADD_(a, b) a + b
#define _MUL_(a, b) a * b
#define _MIN_(a, b) ((a) < (b) ? (a) : (b))int main()
{int i = 1;int j = 10;printf("%d\n", _MUL_(_ADD_(1, 2), _ADD_(3, 4)));printf("%d\n", _MIN_(i++, j));//printf("%d\n", 1 + 2 * 3 + 4);//printf("%d\n", ((i++) < (j) ? (i++) : (j)));return 0;
}/*output:
11
2*/

在这里插入图片描述

实验-宏的妙用

#include <stdio.h>
#include <malloc.h>#define MALLOC(type, x)   (type*)malloc(sizeof(type)*x)
#define FREE(p)           (free(p), p=NULL)#define LOG_INT(i)        printf("%s = %d\n", #i, i)
#define LOG_CHAR(c)       printf("%s = %c\n", #c, c)
#define LOG_FLOAT(f)      printf("%s = %f\n", #f, f)
#define LOG_POINTER(p)    printf("%s = %p\n", #p, p)
#define LOG_STRING(s)     printf("%s = %s\n", #s, s)#define FOREACH(i, n)     while(1) { int i = 0, l = n; for(i=0; i < l; i++)
#define BEGIN             {
#define END               } break; }int main()
{int* pi = MALLOC(int, 5);char* str = "D.T.Software";LOG_STRING(str);LOG_POINTER(pi);FOREACH(k, 5)BEGINpi[k] = k + 1;ENDFOREACH(n, 5)BEGINint value = pi[n];LOG_INT(value);ENDFREE(pi);LOG_POINTER(pi);return 0;
}/*output:
str = D.T.Software
pi = 00702D28
value = 1
value = 2
value = 3
value = 4
value = 5
pi = 00000000*/

小结

宏和函数并不是竞争对手
宏能够接受任何类型的参数,效率高,易出错
函数的参数必须是固定类型,效率稍低,不易出错
宏可以实现函数不能实现的功能


http://www.ppmy.cn/news/1431428.html

相关文章

数字化革新:可视化墨水屏引领基板工艺MSAP贴膜阶段迈向无纸化高端制造应用背景

随着科技的飞速发展和环境保护意识的日益增强&#xff0c;制造印刷电路板&#xff08;PCB&#xff09;行业正面临着提升生产效率、降低资源消耗和推动绿色制造的迫切需求。 问题&#xff1a; PCB生产过程对洁净度要求高&#xff0c;传统打印的纸张会有粉尘&#xff0c;纸屑&am…

VMware虚拟机安装CentOS详细教程

前言 最近小白发现&#xff0c;有很多小伙伴在学习过程中都需要配置CentOS的系统&#xff0c;因此决定更新一篇在VMware虚拟机上安装CentOS的教程。 小白最近也去看了一下各种云的服务商出租的服务器&#xff0c;其中可选的系统中也有包括CentOS&#xff0c;所以在VMware配置…

220个常见的金融术语名词解释

标的&#xff08;Underlying&#xff09; 标的代表交易产品或交易工具所基于的单位证券。例如&#xff0c;IBM期权&#xff0c;该期权的标的即为IBM股权。 英文释义&#xff1a; Underlying refers to the security that is the base unit of a product or trading vehicle.…

电脑便签记事本字体如何放大 便签记事本放大字体的方法

在日常工作中&#xff0c;电脑便签记事本已成为我记录琐事、安排日程的得力助手。然而&#xff0c;长时间盯着电脑屏幕&#xff0c;眼睛难免会感到疲劳。尤其是那些密密麻麻的小字&#xff0c;看久了真让人头疼。幸好&#xff0c;我发现了一个简单易行的方法&#xff0c;能轻松…

如何用idm下载迅雷文件 idm怎么安装到浏览器 idm怎么设置中文

如果不是vip用户使用迅雷下载数据文件&#xff0c;其下载速度是很慢的&#xff0c;有的时候还会被限速&#xff0c;所以很多小伙们就开始使用idm下载迅雷文件&#xff0c;idm这款软件最大的优势就是下载速度快&#xff0c;还有就是具备网页捕获功能&#xff0c;能够下载网页上的…

融合麻雀追随机制扰动与柯西变异的蜣螂优化算法,历史位置图,平均适应度收敛图一次性全部搞定,MATLAB代码...

本期文章复现一篇论文&#xff1a;《多策略改进的蜣螂优化算法及其应用》&#xff0c;该成果于2023年12月15日发表于中文核心期刊《计算机科学与探索》&#xff0c;参考文献如下&#xff1a; [1]郭琴,郑巧仙.多策略改进的蜣螂优化算法及其应用[J/OL].计算机科学与探索,1-22[202…

【创建型模式】工厂方法模式

一、简单工厂模式 1.1 简单工厂模式概述 简单工厂模式又叫做静态工厂方法模式。 目的&#xff1a;定义一个用于创建对象的接口。实质&#xff1a;由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 简单工厂模式…

QT设置QTextEdit的文本颜色无效

ui->textEdit->setTextColor(QColor(Qt::red)); //无效 具体原因未知 // 创建一个QPalette对象&#xff0c;该对象包含了控件的各种颜色角色设置 QPalette palette ui->textEdit->palette(); // 使用palette.setColor()方法来修改文本颜色角色&#xff08;QPalett…