iOS笔记:第五篇 C语言 函数

2024-09-02 12:08

本文主要是介绍iOS笔记:第五篇 C语言 函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


 第一节 函数

 1.有一段代码需要重用/复用

   重用:这段代码需要在不同的地方使用到

   循环:一段代码反复不停的执行

 

 2.重用代码最简单的方式就是复制粘贴来实现

   1)代码冗余

   2)后期的维护和修改极其不方便

 

 3.函数

   作用:可以将一段代码科学的重用

   重用的原理:将要被重用的代码塞到函数中,要执行时只需要调用就可以来,

              函数一调用,函数中的代码就会被执行

   语法:

         函数的返回值类型函数名称([参数])

        

            要重用的代码;

            函数体;

         

   定义函数的位置:直接定义在C源文件之中,与main函数同级别

   函数的调用:CPU只会执行程序中的main函数中的代码,其他函数中的代码不会去主动执行

   调用语法:函数名();

 

   CPU执行到调用函数的语句的时候,就会跳转到函数的内部执行,当函数中代码执行完后用回来继续执行。

 

 4.什么时候需要定义一个函数

   当有一段代码需要被重用或者是在完成独立的功能时,就可以将其封装到一个函数中

 

 5.定义函数需要注意的点

   1)函数的返回值类型写的是void

   2)函数名。由程序员定义的,函数名要符合标识符的命名规则及规范

      标识符:是一个统称。变量名、函数名、标签名

      函数的命名规范:

            看到函数名就知道函数中的代码在做什么。建议函数名用一个动词。

   3)定义函数名后的小括弧是必不可少的,小括弧中的参数可以写野可以不写

   4)不要在函数名小括号后加分号

   5)函数头与函数体

      当函数被调用的时候,函数的函数体就会被调用

   6)调用函数的时候

       函数名必须要与定义的函数的名字一致

 

 6.函数的好处

   1)减少代码的冗余(一次定义,随处调用)

   2)后期的维护和修改非常方便,函数中的代码被改之后,调用函数的地方自动随着改了

   3)隐蔽代码的实现。对于调用者而言,无需关心函数的内部是如何实现的。

 

 7.函数的调试

   step over:就是将高亮选中的代码一下执行完毕,如果高亮选中的代码是在调用一个函数,这个时候就讲函数中的代码一下执行完毕

   step into:如果高亮选中的代码是在调用一个函数,这个时候就会跳到函数的内部去跟着执行

 

 

第二节 全局变量

 

 1.变量分两类

   局部变量:定义在函数内部的变量就是局部变量

   全局变量:定义在函数外部的变量,直接定义在C源文件中的变量就是全局变量

 

 2.全局变量和局部变量的区别

   1)声明局部变量的时候,如果没有初始化局部变量,那么局部变量中的值是一个垃圾值

       特别强调:不一定是0

       全局变量如果没有初始化,那么编译器会自动的将全局变量的值初始化为0

   2)作用域不同

       局部变量只能在函数内部访问,全局变量可以在该源文件中的所有函数中访问

       全局变量可以被当前源文件中的所有的函数所共享,无论在哪一个函数在访问这个全局变量,访问的都是同一个

 

 3.函数如果不被调用,那么函数中的代码是不会被执行的

 

 4.全局变量一般情况下都是定义在所有的函数前面,这样才可以被所有函数访问

 

 5.函数中的局部变量,当函数执行完毕之后,定义在函数中的局部变量酒会被回收,下次再去调用函数的时候,再次去声明

 

 6.可以在函数的内部定义一个和全局变量形同的局部变量

   在定义局部变量之前访问的是全局变量,定义之后访问的就是局部变量

 

 #include <stdio.h>

  int num;//全局变量num

 void test()

 {

   num++;

   printf("%d",num);//打印的是全局变量num的值

 }

 int main(int argc, const char * argv[]) {

 

   printf("%d",num);//打印的是全局变量num的值

   int num;

   printf("%d",num);//打印的是局部变量num的值

 

   return 0;

 }

  

第三节 带参数的函数

 

 1.一个函数实际上就是一个单独的功能

 

 2.在函数完成自己功能的时候需要由调用者传递给其一些数据,

 

 3.函数的参数

   1)定义在函数名后的小括弧中的变量就是函数参数

       参数的本质就是定义在这个函数中的局部变量,所以在函数中不能再定义一个和参数名相同的局部变量,并且在函数中可以直接使用参数的值

   2)当调用函数时,如果函数有参数,要求在调用函数的时候为函数的参数赋值

   3)调用函数的过程:

       加载函数->声明函数的参数->将实参的值赋值给形参->执行函数体

   4)形式参数:定义函数的时候,声明在函数小括弧中的参数叫形式参数,即形参。

     实际参数:调用参数的时候,为形参赋值的数据,叫实际参数,即实参

   5)为参数传值的过程,本质上是为参数赋值,把实参的值赋给形参

 

 4.参数可以实现的效果

   可以将调用者的数据传递给函数的内部让函数的内部去使用,当函数的内部需要调用者传递一些数据给函数的时候,就可以使用参数。

 

 5.什么时候函数需要带参数

   一个函数是一个独立的功能,函数在完成这个功能点时候需要一个数据,这个数据的类型确定,但是这个数据点具体的取值和来源不确定,是有调用者确定,这个时候就可以将这个数据定义为函数的参数,让调用者在调用的时候传递。

 

 6.带多个参数的函数

   函数是可以带多个参数的,将多个参数声明写在小括弧中,用逗号分开,每个参数都建议指定类型

   调用带多个参数的函数时,实参的个数必须要和形参一致,为形参赋值的时候时按顺序将一个实参赋值给一个形参,所以实际参数的顺序也要与形式参数的顺序一致;实际参数的类型要和形式参数的类型一致,如果不一致,会自己做类型转换

 

 #include <stdio.h>

  //实现的功能:求指定范围中每一个整型数的累加和

 void sum(int num1,int num2)

 {

   int sum = 0;//定义整型变量,用来求和

   for(int i = num1;i <= num2;i++)

   {

       sum += i;//累加

   }

 

   printf("和是%d\n",sum);//打印结果

 }

 

 int main(int argc, const char * argv[]) {

 

   sum(1,100);//调用函数sum

 

   return 0;

 }

 

 

第四节  return关键字和带返回值的函数

 1.return关键字

   1return关键字用在函数体中

       当在函数体中遇到return,就表示立即结束函数体的执行

   2)一般情况下,return用来提前结束函数

       如果return后面还有函数体代码,不会执行,直接结束

 

 2.函数的返回值

   当函数执行完毕后,有一个数据,这个数据函数点内部不确定如何处理,并且这个数据是调用者想要的,此时,函数就应该将这个数据返回给调用者

 

 3.函数如何将数据返回给调用者

   1)先确定要返回给调用者的数据类型

   2)修改函数的返回值类型为要返回的数据的类型

   3)在函数结束之前,使用return关键字将数据返回

 

 4.调用者如何接收函数的返回值

   定义一个和函数返回值类型相同的变量,接收就可以了

 #include <stdio.h>

 

 //实现的功能:求指定范围中每一个整型数的累加和

 int sum(int num1,int num2)

 {

   int sum = 0;//定义整型变量,用来求和

   for(int i = num1;i <= num2;i++)

   {

       sum += i;//累加

   }

 

   return sum;//sum值返回给调用者

 }

 

 int main(int argc, const char * argv[]) {

 

   int a = sum(1,100);//调用函数sum,并将sum中返回的值赋给a

   printf("累加和的两倍是%d\n",a*2);//打印返回值的2

 

   return 0;

 }

 

 5.一些细节问题

   1void代表函数执行完毕之后,没有任何数据要返回给调用者

   2)函数的返回值的类型,代表函数执行完毕之后,有一个什么类型的数据要返回给调用者

   3)一旦函数定义了返回值,则在函数结束之前,必须要返回值类型相同的数据

   4)如果返回的数据类型和函数定义的返回值类型不一致,就会先将数据做类型转换,转换后再返回

   5)一旦函数定义了返回值,则函数中的每一个分支必须要保证在结束之前都要有返回值

 

 #include <stdio.h>

 //实现的功能:判断一个数是不是偶数

 int isOuShu(int num)

 {

   if(num % 2 == 0)

   {

       return 1;

   }

   else

   {

       return 0;

   }

 }

 int main(int argc, const char * argv[]) {

 

   int i = isOuShu(6);

   printf("%d\n",i);

 

   return 0;

 }

 

 

第五节 函数的声明

 

 1.定义函数分两个步骤

   >声明函数,告诉编译器有这个函数

   >实现函数,告诉编译器这个函数的具体实现

 

 2.函数声明的语法:和函数头保持一致     void test();

   作用:告诉编译器,这个函数有

   函数的声明可以放在头部或函数内,但必须要在使用函数之前声明

 

 3.函数有声明就必须要实现

 

 4.函数的声明注意的细节

   1)如果返回值类型为int型,则这个函数可以不声明,但是建议一定要声明

   2)如果被调用的函数在主调函数之前,可以不声明

   3)如果声明函数的时候,函数有参数,参数只需要指定类型就可以了



这篇关于iOS笔记:第五篇 C语言 函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129912

相关文章

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear