c++里面的函数学习 day3

【牛客网C++服务器项目学习】Day3-GDB、I/O库函数、虚拟内存、文件描述符 Day3-GDB、I/O库函数、虚拟内存、文件描述符 阅读详情

3.1 传参时的小知识点:默认值的使用与规则

#include <iostream>

using namespace std;

void foo(int a, int b = 10) // 这是传的两个参数。

{
    cout << a << ' ' << b << endl;
}

int main()
{
    foo(5);    /*这里只给a赋了值,没给b赋值,但是函数foo里面有初始值b=10,所以还是可以输出,
        结果为 5 10*/
    foo(5, 3); /*这里输入a=5,b=3,哪怕b已经有了默认值10,也是输出的 5 3。*/
               /*从这里就可以看出结论:当多个参数中有参数没赋值的时候,若是调用的函数里面已有初始值,那么就自动的使用
               初始值;若是有初始值还输入一个值,那么就不用初始值,就用输入的那个值。
                  这个初始值有点备用的意思。*/
    return 0;
}

/*注意,赋初始值是有规则的。你要么全部都赋初始值,要么就第一个初始值不赋值,剩下的都赋值。不能断断续续的
赋值,因为内存是连续的,你断断续续的赋值,就不符合规则了。*/

3.2 返回类型和return语句
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。return语句有两种形式:

return;
return expression;

3.3无返回值函数
没有返回值的return语句只能用在返回类型是void的函数中。返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return。所以一般void类型的函数后面不写return。

通常情况下,void函数如果想在它的中间位置提前退出,可以使用return语句。return的这种用法有点类似于我们用break语句退出循环。

#include <iostream>

using namespace std;

int max(int x, int y)
{
    if (x > y)
        return x;
        /*当我输入4 3 时,输出的只有4。说明语句到return x就截止了,退出了这个函数。后面的语句没运行到*/
    puts("hello world!");
    return y;
    /*当我输入3 4 时,输出的结果时:hello world!  4 。前面的语句不符合条件,直接运行后面的语句,从这
    就已经可以看出return 语句表示结束并跳出这个函数,返回所得到的值。*/
}

int main()
{
    int a, b;
    cin >> a >> b;
    cout << max(a, b) << endl;

    return 0;
}

总结:return 语句是函数是什么类型就返回什么类型的值。例如这里是int型函数,那么返回的x,y值都是int型。

3.4 函数调用的过程(有图分析)

示例代码如下:

#include <iostream>

using namespace std;

void goo()
{
    puts("call go");
}

void foo()


{
    puts("call fo");
    goo();
    goo();
}

int main()
{
    foo();
    foo();

    return 0;
}

上面的代码看起来十分繁琐,一会儿调用这个函数,一会儿调用那个函数,可是,我们只要画一个图,仔细分析,就会发现他的规律,这对我们以后学习数据结构里面的树做一点小小的基础。

我画的这张图就已经很清晰的表示了调用函数的过程。语言描述就是:首先进入main函数,main函数里面有两个foo函数,那就 先调用第一个foo函数,发现foo函数里面有两个goo函数,那么先调用第一个goo函数,执行里面的操作,并把结果返回给第一个foo函数,因为一个foo函数里面要调用两次goo函数,那么另一次调用也与上一次调用goo函数的流程和操作是一样的,那么最终foo函数会得到最终的结果,然后这最终的结果又返回给main函数。main函数里面的另一个foo函数操作也是如此,组后结合两次的结果合在一起就是最终结果了。所以输出为:

call fo
call go
call go
call fo
call go
call go

总结:从这个例子我们可以发现,函数的调用是层层递进的,是你要调用哪个函数就先进入哪个函数内,把执行的结果返回后再接着执行下面的语句。这就不像以前没有调用函数,只在main函数里面写,里面的代码语句执行是按顺序进行的,这一点得注意。

还有,从这个调用函数的过程图我们可以观察出,函数调用与返回他的值是双向的,而且各个之间是没有交叉的,形成像树一样的结构,给人一种很强的立体感。这个树在后面数据结构里面会有,我只是大致了解一点,等到了后面彻底学懂了再说吧。

3.4 函数递归

在一个函数内部,也可以调用函数本身。

下面用一个示例代码来具体看看:

#include <iostream>
//递归的一个简单例子:求阶乘
using namespace std;

int fact(int n)
{
    if (n <= 1)//0的阶乘也是1,差点给忘了。
        return 1; //1的阶乘是1。
        //只要n不是1,那么就返回下面这个式子。
    return n * fact(n - 1);
}

int main()
{
    int b = fact(5);//调用fact函数求阶乘。
    cout << b << endl;//输出结果。

    return 0;
}

和上面一样,我画这个阶乘的执行过程图,毕竟咱是新手,多画画总有帮助。

 

从上面的图可以看出,

if (n<= 1)

        return 1;这一句是必要的。虽然我们知道1的阶乘是1,0的阶乘也是1,也要写出来。因为这一句不仅表示了这两个特殊取值,也是一个边界,当n逐步递减到1时,那么就结束函数,返回最终的结果。看懂了这个题,那递归你也就懂了。

【C++养成计划】不聊学习只谈干货(Day1) 给小白定制的专属《C++21天养成计划》,让你以最快的速度掌握C++编程 阅读详情

相关推荐

【C++养成计划】深入浅出——函数(Day6)

给小白定制的专属《C++21天养成计划》,大神勿扰!

不积跬步,无以至千里! 3952

c++学习day3——数组/函数

所谓数组,就是一个集合,里面存放了相同类型的数据元素特点:①数组中的每个元素都是相同的类型②数组是由连续的内存位置组成的①数据类型 数组名 [ 数组长度 ];②数据类型 数组名 [ 数组长度 ] = {值1,值2,... };③数据类型 数组名 [ ] = {值1,值2,... };注意:①没有值则默认输出为零。②定义数组的时候,必须有初始长度。①数据类型 数组名 [ 行数 ][ 列数 ];②数据类型 数组名 [ 行数 ][ 列数 ] = { {数据1,数据2},{数据3,数据4} };③。

weixin_51976497的博客 637

随机森林的可解释性分析(含python代码)

随机森林的“黑箱”特性逐渐凸显,这使得我们难以理解和解释模型内部的工作机制。对于许多应用场景而言,仅仅获得高准确率的预测结果是不够的;了解预测背后的逻辑同样重要,特别是在医疗诊断、金融风险评估等领域。因此,对随机森林进行可解释性分析变得尤为重要。

m0_59257547的博客 3848

Day3C++学习记录 构造函数与析构函数,拷贝

【代码】Day4C++学习记录 构造函数与析构函数,拷贝。

2402_88549995的博客 148

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))

程序需求,需要完成task与task之间  字符数组的数据传输 比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组 具体的程序示意如下: 图1:消息邮箱测试中的     向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的

faguoduifangui的博客 4540

Windows系统下搭建MPI(并行计算)环境

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;W

weixin_43417960的博客 5752

C++学习(DAY 3)函数

p95~p98 {1}函数的默认函数:只提供默认缺省值 1.如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值 2.如果函数声明有默认参数,函数实现就不能有默认参数 {2}函数的占位参数(使用较少) {3}函数重载基本语法 1.同一个作用域下 2.函数名称相同 3.函数参数类型不同/个数不同/顺序不同 4.函数的返回值不可以作为函数重载的条件 {4}函数重载的注意事项 ...

m0_55006160的博客 166

时序异常检测汇总

时序异常检测

Mark_Australia的博客 1万+

【自用】C++学习-函数的分文件编写-Day 3

3.创建另一个.cpp文件(我称之为主程序文件),在主程序文件中链接.h文件,并调用功能函数文件。3.创建另一个.cpp文件(我称之为主程序文件),在主程序文件中链接.h文件,并调用功能函数文件。2.创建一个.cpp文件(我称为功能函数文件),在功能函数文件中写函数定义,并链接到.h文件中。2.创建一个.cpp文件(我称为功能函数文件),在功能函数文件中写函数定义,并链接到.h文件中。1.创建一个.h文件,在.h文件中写函数声明。1.创建一个.h文件,在.h文件中写函数声明。二、函数分文件编写的步骤。

qq_45432533的博客 311

SAP Fiori Launchpad Tile,UI5 应用,和 PFCG Role 的对应关系

问题:已经看到了SAP Fiori Launchpad上的某个tile,如何反推后台需要配置哪个PFCG Role才能看到该tile? 这个问题是今天一个朋友在微信上问我的。因为我最近忙着学习一个新的SAP产品,所以这个问题也没有时间展开来写,本文就只做概要介绍。 下图是一个Gateway系统上打开的SAP CRM Fiori Launchpad: 如何弄清楚后台用户配置了哪个PFCG Role之后,才能看到Sales Representative(CRM)这个Group下的tile? 既然当前我使用的用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1520

IEC 61850标准协议解读 3.MMS服务

摘要:本文系统介绍了MMS(制造报文规范)的基础知识及其在IEC61850中的应用。首先解析MMS的核心定义、通信流程(带确认/不带确认服务)、虚拟制造设备(VMD)概念及核心对象(域/有名变量等)。重点阐述IEC61850与MMS的映射关系,包括对象分层映射、服务转换规则及数据类型对应。深入分析ASN.1编解码机制,说明MMS PDU的分层结构与解码流程。最后通过典型报文案例(报告服务、控制服务、文件传输等)和通信初始化流程,展示MMS在智能变电站中的实际应用。全文揭示了MMS作为抽象应用层协议如何通过标

张二狗的博客 724

C++Cherno 学习笔记day3 [8]-[11] C++变量、函数、头文件

如果一个函数声明了非 void 的返回类型,则必须保证在所有可能的执行路径上返回一个兼容类型的值。Byte(字节) 是计算机中最基本的存储单位之一,通常表示为一个 8 位(bit) 的二进制数据单元。几乎每个编译器都支持pragma once,Visual Studio、GCC、Clang、MSVC等。头文件:某个或几个函数的“证书”,当你(编译文件)持有这个函数的“证书”的时候,才可以调用它。监督头文件,阻止单个头文件多次被包含,并转换为单个翻译单元。“”引号是外部文件(包含相对于当前文件的文件)

Shirleyyy1的博客 745

SerDes电路的PCB仿真设计规则及策略

SerDes的PCB设计中,重点工作是使用3D 电磁 (EM) 场求解器,进行过孔结构优化,包括 BGA的扇入和扇出区域以及布线的过孔区域,并且,利用连接器供应商提供加密的 3D 模型,进行连接器和 PCB 的级联仿真,最终获取系统级的通道性能参数,如插入损耗、回波损耗、串扰和模式转换、阻抗曲线等,如果发现任何缺陷,再进行进一步优化,这一过程中,推荐进行拆分仿真,以提高设计效率。

一只豌豆象的博客 2191

【自用】C++学习-函数的定义&调用&声明 Day3

这种使用方式会导致如果我们需要实现非常复杂的功能,都写在main函数中,main函数的体量会变得非常庞大,而且一旦出错修改起来也会牵一发而动全身,总之很不方便。比如我要对两个数字进行交换,在main函数中我需要这样写。这里其实在swap中就把结果宣布出来(cout那一句)是不太对的,好的小房间应该只承担处理功能,处理完把结果推出小房间,由主干道宣布结果。那这样的代码就要在主函数中重复很多次,所以想到一个办法就是我写一个函数命名为“交换两个数的值”,每次我想交换这两个数时直接调用这个函数就可以更加便捷。

qq_45432533的博客 344

QEMU理解与分析系列(11):QEMU内存机制

在物理机上,CPU 对于内存的访问在保护模式下通过分段分页的形式实现。在该模式下,CPU 访问时使用的是虚拟地址,通过 MMU 映射到物理地址,将虚拟地址转换为物理地址才能访问实际的物理内存。同样的,虚拟机模拟的物理机同样需要有上述的机制,也需要有从虚拟地址到物理地址的转换。这里需要注意,模拟的物理机的物理地址本质上是 qemu 的虚拟地址。

swh547的博客 49

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

小甲鱼C++学习笔记Day3(函数的重载)

C++里的函数重载(overloading)很强大 所谓重载函数的实质就是用同样的名字再定义一个有着不同参数但有着同样用途的函数。(人格分裂、多重身份。。。。) Day2例题改 #include <iostream> void convertTemperature(double tempIn, char typeIn); int main() { double tempIn; char typeIn; std::cout << "请以【XX.X C】或者【XX.X F】输

qq_35282458的博客 170

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++学习笔记(Day3 函数调用例题)

计算x的n次方 #include <iostream> using namespace std; //计算x的n次方 double power(double x, int n){ double val = 1.0; while(n--){ val *= x; } return val; } int main() { cout << "5 to the power 2 is " << power(5,2) &lt

Seasonboboo的博客 890

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++基础学习DAY3-06 构造函数的调用规则

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int a); ~MyClass(); private: }; MyClass::MyClass() { cout << "默认构造" ...

Steven_Shi的博客 165

c++ primer plus 函数重载-费曼学习-day3

相同函数名,同一功能处理不同数据类型可使用函数重载

蜗蜗的专栏 285

C++基础学习DAY3-04 构造函数的分类和调用

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //分类 //1、按照参数:无参构造、有参构造 //2、按照类型:普通构造、拷贝构造 class Person { public: Person(); Person(int a); Person(const Person &p)...

Steven_Shi的博客 183

C++基础学习DAY3-05 拷贝构造函数的调用时机

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Person { public: Person(); Person(int a); Person(const Person& p); ~Person(); int m_Age; private: }; Perso...

Steven_Shi的博客 188

C++学习笔记(Day3 函数的嵌套使用)

函数的嵌套使用 栈保存了当前现场和返回地址(第九章会讲)单步调试可以看 例3.7 求两个数的平方和 #include <iostream> using namespace std; int fun2(int m){ return m * m; } int fun1(int x, int y){ return fun2(x) + fun2(y); } int main() { int a,b; cout <<"Enter two inte.

Seasonboboo的博客 335

161003

1625-5王子昂总结《2016年10月3日》 【连续3天总结】 A. 1)虚拟机的day01内容学完 90%     2)C++的第九周内容学完 100% B.数据库部分 完成了单行函数,组函数和分组的学习。包括字符、数字、日期、类型转换和通用函数。函数的使用主要靠查询手册而不是硬记。对空值的处理和通用函数、滤空函数的熟练运用至关重要。学习了IF-THEN-ELSE逻辑在

whklhhhh的博客 511

C++学习day03

创建test.cpp文件添加以下语句。

m0_63771366的博客 948

CPP学习第一天

学习Cpp的第一天

luoxuezhixing的博客 785

我的c++学习之旅 cpp-learning-journey day02

本文总结了C++类中成员返回对象问题和继承机制。在类的成员函数中返回对象时,可以返回对象本身(安全但效率低)、对象引用(高效但可能破坏封装性)或成员变量(需考虑拷贝效率)。继承方面,介绍了三种继承方式(public/protected/private)对成员访问权限的影响,以及构造/析构函数的调用顺序。还讨论了多继承的初始化顺序和同名成员访问问题。特别强调了继承中的多态性,包括基类指针/引用隐式转换、函数隐藏现象以及虚函数实现多态的重要性。这些知识点对理解C++面向对象编程的核心机制至关重要。

2301_80221160的博客 1866
上一篇: c++里面的函数学习 day2
下一篇: 函数基础题:打印数字
羽殇惜月
博客等级 码龄4年 285粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值