006-函数递归,内联,变参,声明

这篇具有很好参考价值的文章主要介绍了006-函数递归,内联,变参,声明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

006-函数递归,内联,变参,声明

练习:
		要求自定义一个函数,用来比较两个数字的大小,返回较大的数字
		要求自定义一个函数,用来求取输入数字中的最大值

函数嵌套:

​ 函数与函数之间相互进行调用;

递归函数:

​ 特殊的嵌套函数
​ 特殊在递归函数是自己调用自己
​ 即是函数A的函数体重又一次调用了函数A自己

函数A调用了函数B,函数B中又调用了函数A,两者属于递归吗?
属于递归

每一次调用函数,进行递归时,系统会不会为新的调用函数分配空间??

每一次调用函数,进行递归时,上一次递归时系统为函数分配的空间会被释放吗??
不会

如果递归函数没有一个终止条件,会怎么样?
没有一个终止条件,递归将永远持续下去,没有尽头
每一次进行递归函数调用,系统都会为新的函数分配空间
而没有尽头的递归是无法停止的,所以最终堆栈空间将不够使用,导致爆炸

结论就是:
为了保证递归函数的正常执行,或者说函数的正常执行;
递归函数必须有一个终止条件;

练习:
	使用递归的方式,实现求取10!

	10!
	=9! * 10
	=8! * 9
	=7! * 8
	...
	=2! * 3
	=1! * 2
    =1

内联函数:

inline
是函数的运行速率更快
因为省略了函数调用是的分配,和函数运行结束的回收

生效过程是编译过程

格式:
	在正常的函数定义前,添加关键字inline
	声明其为内联函数
	
	inline int func(int x)
	{
		...
	}

变参函数:

​ 函数参数个数不定,需根据实际意义,或者已出现的相关参数进行添加

​ int printf(const char *format, …);
​ 只定义了第一个参数,省略号表示后面还有不定个数的参数

注意:
C语言的两个基本规则
先定义,后使用 变量
先声明,后使用 函数

函数的声明:

​ 声明格式:
​ 返回值类型 函数名(第一个参数类型 形参名,第二个参数类型 形参名…);
​ 原函数有多少参数就写多少参数;

例子:
	int func(int a,int b,int c,int d,int e);
	或者
	int func(int ,int ,int ,int ,int );
声明的意义:
	为了调用该函数时,能访问到该函数的函数原型

声明的位置:
在目标函数被调用的位置之前进行声明
若目标函数的原型定义位置,在被调用的位置之前,则可以不再额外声明

同一函数内怎样声明:
因为编译器的原因,有些环境下可以不用提前声明
但是建议按照规则进行声明

或者干脆把将被调用的函数的原型,定义在被调用位置之前;

练习:

练习:

  1. 求取所有的水仙花数
  2. 输入一个十进制数N,将它转换成R进制数输出。
  • 输入
    输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。

  • 输出
    为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

  1. 给定一个日期,输出这个日期是该年的第几天。
  • 输入
    输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。

  • 输出
    对于每组输入数据,输出一行,表示该日期是该年的第几天。

答案参考:

练习一:

#include <stdio.h>

int main()
{
	int a,x,y,z;
	for(a=100;a<=999;a++)
	{
		x = a%10;
		y = a/10%10;
		z = a/100;
		if(a==x*x*x+y*y*y+z*z*z)
		{
			printf("水仙花:%d\n",a);
		}
	}
	return 0;
} 

练习二:

#include <stdio.h>

int func(int num,int n)  //实现目标数字转换进制
{
	int temp[32]={0};
	int i = 0;
	
	while(1)  //0 != num
	{
		temp[i] = num%n; //利用取商留余法
		num /= n;
		i++;
		
		if(num == 0)
		{
			break;
		}
	}
	for(i--;i>=0;i--)
	{
		if(temp[i]<10)
		{
			printf("%c",temp[i]+48); //48是0的ASCII
		}
		else
		{
			printf("%c",temp[i]-10+65); //65是A的
		}
		printf("\n");
	}
}
int main()
{
	int num,n;
	
	printf("请输入数字和进制:");
	scanf("%d%d",&num,&n);
	func(num,n);
	return 0;
}

练习三:文章来源地址https://www.toymoban.com/news/detail-611234.html

#include <stdio.h>

int main()
{	
    int year,month,day,sum,x;
    printf("请输入日期(YYYY/MM/DD):");
    scanf("%d/%d/%d",&year,&month,&day);
	switch(month)
	{
		case 1:sum=0;break;
		case 2:sum=31;break;
		case 3:sum=59;break;
		case 4:sum=90;break;
		case 5:sum=120;break;
		case 6:sum=151;break;
		case 7:sum=181;break;
		case 8:sum=212;break;
		case 9:sum=243;break;
		case 10:sum=273;break;
		case 11:sum=304;break;
		case 12:sum=334;break;
		default:printf("data error");break;
	}
	if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
	{
		if(day>31)
		{
			printf("day 错误\n");
			return 0;
		}
	}
	if(month==4||month==6||month==9||month==11)
	{
		if(day>30)
		{
			printf("day 错误\n");
			return 0;
		}
	}
	if(month==2)
	{
		if(year%400==0||year%4==0&&!year%100==0)
		{
			if(day>29)
			{
				printf("day 错误\n");
			    return 0;
			}						
		}
		else
		{
			if(day>28)
			{	
				printf("day 错误\n");
				return 0;
            }				
		}	
	}
	sum = sum+day;
	if(year%400==0||year%4==0&&!year%100==0)
	{
		x = 1;
	}
    else
	{
		x = 0;
	}
	if(x==1&&month>2)
	{
		sum++;
	}
	printf("这天是该年的%d天\n",sum);
}

到了这里,关于006-函数递归,内联,变参,声明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FPGA嵌入式开发一些Xilinx SDK库函数的理解

    最近在测试AXI Quad SPI这个IP核的端口时序,搭建BD后导出到硬件,在SDK中导入xspi_intr_example.c的源文件,在师兄的帮助下,浅浅研究了一下代码。 首先,需要修改源程序中的错误,参照CSDN文章:ZYNQ中断示例修改 做出以下修改: 此外,还要对中断驱动实例名称进行修改: 以下

    2024年02月12日
    浏览(45)
  • 在嵌入式设备中用多项式快速计算三角函数和方根

    惯性传感器的倾角计算要用到三角函数. 在 MCS-51, Cortex M0, M3 之类的芯片上编程时, 能使用的资源是非常有限, 通常只有两位数KB的Flash, 个位数KB的RAM. 如果要使用三角函数和开方就要引入 math.h, 会消耗掉10KB以上的Flash空间. 在很多情况下受硬件资源限制无法使用 math.h, 这时候使

    2024年03月09日
    浏览(74)
  • 价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?

            请说下单片机(Arm)在运行到 main() 函数前,都做了哪些工作? 系统初始化工作,太泛泛 硬件初始化,比较不具体         这道题应该从两方面回答,一个是比较表面的硬件的初始化(价值 200),另一个比较深层次的 C 环境的初始化,这也是加分比较多的一点(价

    2024年02月14日
    浏览(37)
  • 【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 GCC提供了一些专门的功能,用于访问特定的硬件指令或者实现特定的优化,它们被称为\\\" __builtin \\\"函数。 这些

    2024年02月13日
    浏览(49)
  • 【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 详细介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 GCC提供了一些专门的功能,用于访问特定的硬件指令或者实现特定的优化,它们被称为\\\" __builtin \\\"函数。 这些

    2024年02月13日
    浏览(49)
  • 【嵌入式软件C编程】主函数free子函数malloc地址的两种方式以及注意事项

    本文档主要记录嵌入式C语言在子函数中应用malloc函数的方式,在实际项目中内存管理特别重要 一般在主函数中(main)使用malloc函数,然后在通过free函数进行释放内存,但有时候如果必须在子函数长调用malloc函数该怎样进行内存释放呢? 📋 个人简介 💖 作者简介:大家好,

    2024年02月09日
    浏览(41)
  • 【ARM 嵌入式 编译系列 3.7 -- newlib 库文件与存根函数 stubs 详细介绍】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 newlib 是为嵌入式系统设计的一种 C 标准库实现,它特别适用于那些没有传统操作系统支持的系统。由于嵌入式系统的资源通常有限, newlib 着重于减少资源使用,同时提供了一组相对完整的 C 标准库函数。 相比于其它版

    2024年01月25日
    浏览(36)
  • 【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】

    在 C 语言中,可以使用宏定义来创建用于清除(清零)或设置(置一)32位地址中特定位的函数。以下是两个宏定义的示例: 这里的 addr 是指向目标32位地址的指针, bit 是需要操作的位的索引(从0开始计数)。 示例使用方式 假设要操作的是一个具有可读写属性的寄存器,它

    2024年03月22日
    浏览(50)
  • C/C++|物联网开发入门+项目实战|函数输入与输出|值传递|地址传递|连续空间的传递|嵌入式C语言高级|C语言函数的使用-学习笔记(11)

    参考: 麦子学院-嵌入式C语言高级-C语言函数的使用 一堆代码的集合,用一个标签去描述它 复用化,降低冗余度 标签 ------ 函数名 函数和数组都属于内存空间,函数具备3要素: int *p; int a[100]; 1、函数名(地址) 2、输入参数 3、返回值 在定义函数时,必须将3要素告知编译器

    2023年04月20日
    浏览(46)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第七天-内核函数接口(物联技术666)

    链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd=1688 提取码:1688 //************************************************** #include linux/module.h    /*module_init()*/ #include linux/kernel.h        /* printk() */ #include linux/init.h            /* __init __exit */ #include linux/fs.h              /* file_opera

    2024年02月22日
    浏览(60)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包