C语言学习笔记 - 函数

本文深入探讨C语言中函数的重要性及其实现方式,包括函数的定义、分类、声明、调用等核心概念,并介绍变量的作用域及存储方式。此外,还列举了一些常用的系统函数。

C语言学习笔记 - 函数

本笔记为看B站郝斌老师C语言教程所作
因为之前已经看过一部分,笔记写在了本子上,故本笔记前面不做重复记录

一、为什么需要函数

举例:比较两个数的最大值

# include<stdio.h>

void max(int i, int j) 		//max是函数的名字,i和j是形式参数,简称形参,void表示没有返回值。
{
	if(i > j)
		printf("%d\n", i);
	else
		printf("%d\n", j);
}

int main(void)
{
	int a, b, c, d, e, f;
	a = 1, b = 2, c = 3, d = 9, e = -5, f = 100;
	max(a, b);
	max(c,d);
	max(e, f);
}

为什么需要函数?
答:避免了重复性操作,有利于程序的模块化,

二、什么叫函数

逻辑上:能够完成特定功能的独立的代码块
物理上:能够接收数据,能够对接收的数据进行处理,能够将数据处理的结果返回(也可以不返回任何值)
总结:函数是个工具,它是为了解决大量类似的问题而设计的,函数可以当作一个黑匣子

# include<stdio.h>

int f(void)		//括号中的void表示该函数不能接收数据,int表示该函数返回值是int类型的
{
	return 10;		//正确,该子函数可以有返回值
}
void g(viod)		//viod在前表示该子函数没有返回值,后面不能加return
{
	return 10;		//错误,与该子函数行首的viod相矛盾
}
int main(void)
{
	int  j;
	j = f();		//调用f()函数并赋值给j
	printf("%d\n",j);
	return 0;
}

int f(void) //括号中的void表示该函数不能接收数据,int表示该函数返回值是int类型的
void g(viod) //viod在前表示该子函数没有返回值,后面不能加return

三、如何定义函数

函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}

  • 函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法

  • return 表达式;(例如:return 10;) 的含义:

    • 终止被调函数,向主调函数返回表达式的值;
    • 如果表达式为空,则只终止函数,不向主调函数返回任何值
    • break是用来终止循环和switch的,而return是用来终止函数的
      例如:
void f()
{
	return;		//return只用来终止函数,不向主调函数返回任何值
}

int f()
{
	return 10;		//终止函数且向主调函数返回10
}
  • return和break的区别
viod f(viod)
{
	int i;
	for(i=0; i<5;++i)
	{
		printf("大家辛苦了!\n");
		break;
	}
	printf("同志们好!\n");
}

上面代码打印一遍“大家辛苦了”一遍“同志们好”,因为函数里面的break使进程跳出了for循环。

void max(int i, int j) 
{
	int i;
	for(i=0; i<5;++i)
	{
		printf("大家辛苦了!\n");
		return;
	}
	printf("同志们好!\n");
}

上面代码只打印一遍“大家辛苦了,因为函数里面的return终止了整个子函数。

  • 函数返回值的类型也成为函数的类型,因为如果_函数名前的返回值类型_和_函数函数执行体中return表达式中表达式的类型_不同的话,则最终函数返回值的类型以_函数名前的返回值类型_为准。
    例如:
int f(void)		//括号中的void表示该函数不能接收数据,int表示该函数返回值是int类型的
{
	return 10.5;		//因为函数的返回值类型是int,所以最终f返回的是10而不是10.5
}

四、函数的分类

主要分为

  • 有参函数{void max(int i, int j) }和无参函数{void max(int i, int j) }
  • 有返回值和无返回值
  • 库函数和用户自定义函数
  • 普通函数和子函数(一个程序必须有且只能有一个主函数)(主函数可以调用普通函数,普通函数不能调用主函数)(普通函数之间可以相互调用)(主函数是程序的入口,也是程序的出口)

五、函数的声明

函数在使用之前要先声明
因为函数执行是从主函数开始执行的,如果子函数在主函数后面且主函数调用了子函数,则会报错,此时需要在主函数之前声明一下,我后面写了这个子函数,调用的时候去后面查找就行。

注意的问题
函数调用和函数定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置声明
函数前置声明:
1.告诉编译器即将可能出现的若干个字母代表的是一个函数。
2.告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况。
3.函数声明是一个语句,末尾必须加分号。
4.对库函数的声明是通过#include<库函数所在的文件名字.h>来实现的。

# include <stdio.h>
void f(void);		//函数在使用之前需要先声明
int main(void)
{
	f();
	return o;
}
viod f(void)
{
	printf("哈哈\n");
}

形参和实参

# include <stdio.h>
void f(void);		//函数在使用之前需要先声明
int main(void)
{
	f(5);		//5为实参
	return o;
}
viod f(int i)		//i为形参
{
	printf("哈哈\n");
}

六、常用的系统函数

  • doule sqrt(double x); 求x的平方根
  • int abs(int x); 求x的绝对值(整数)
  • double fabs(double x); 求x的绝对值(非整数)

推荐书籍《turboc 2.0实用大全》主要讲解C语言常用系统函数

七、变量的作用域和存储方式

  • 变量按作用域分
    • 全局变量:
      • 在所有函数外部定义的变量全局变量
      • 使用范围:从定义位置开始到整个程序结束
    • 局部变量:
      • 在一个函数内部定义的变量或者函数的形参都统称局部变量
      • 使用范围:只能在本函数内部使用
    • 注意的问题:
      • 全局变量和局部变量命名冲突的问题:在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量
# include<stdio.h>

int k = 1000;		//全局变量,要放在所有函数之前

viod f(int i)
{
	int j = 20;		//	局部变量
}
int main(void)
{
	int i = 10;		//局部变量
	return 0;
}
  • 变量按存储方式分
    • 静态变量
    • 自动变量
    • 寄存器变量
内容概要:该论文提出了一种结合空中计算和深度学习的非合作通信信号盲识别方法。传统方法将编码方式和调制类型的识别分开处理,导致资源浪费。本文方法能够同时识别不同通信信号的编码方式和调制类型,有效节省计算和通信资源。空中计算作为6G空天地一体化网络的亮点,具有实时监测和分析能力,可支持非合作通信。论文通过在不同条件下进行仿真实验,证明了所提方法具有优越的识别准确率。该方法在频谱管理、无人机通信场景中的干扰源识别以及恶意信号检测等方面具有应用价值。此外,论文还通过增强型信号生成器、改进的多任务模型和混合训练策略等扩展实现,进一步提升了识别效果和实用性。;适合人群:具备一定通信工程和机器学习基础的研究人员、工程师和技术爱好者。;使用场景及目标:①适用于6G空天地一体化网络中的非合作通信信号识别;②用于频谱监测、无人机通信场景中的干扰源识别和恶意信号检测;③提高通信系统的安全性和可靠性,节省计算资源。;其他说明:论文不仅复现了核心思想,还针对文中提到的相关工作和挑战进行了扩展和改进,特别是增强了对于各类编码方式和调制类型的支持,同时改进了模型架构和训练策略,更符合6G空天地一体化网络中对非合作通信信号盲识别的实际需求。代码实现详细,涵盖从数据生成到模型训练评估的全过程,并提供了丰富的实验结果和对比分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值