函数的学习(二)

news2024/9/23 17:25:49

1.函数嵌套

在C语言中,函数的嵌套是指在一个函数内部调用另一个函数。通过函数的嵌套,可以将程序的功能细化,提高代码的可读性和可维护性。函数的嵌套可以是直接嵌套,也可以是间接嵌套。

直接嵌套是指一个函数直接在另一个函数内部调用的情况。例如:

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int calculate(int a, int b) {
    int result = add(a, b);
    int finalResult = subtract(result, b);
    return finalResult;
}

int main() {
    int a = 10;
    int b = 5;
    int result = calculate(a, b);
    printf("Result: %d\n", result);
    return 0;
}

上述代码中,calculate函数内部先调用add函数计算两个数的和,然后再调用subtract函数计算结果与第二个数的差,并返回最终结果。main函数通过调用calculate函数来获取计算结果。

运行结果如下所示:

通过函数的嵌套,可以实现程序的模块化和复用,提高代码的可读性和可维护性。需要注意的是,函数的嵌套过多可能会导致代码复杂度增加,应尽量控制函数的嵌套层级。

2.函数的链式访问

在C语言中,函数的链式访问是指通过连续调用多个函数来实现对对象或结构体的一系列操作。链式访问可以使代码更简洁、易读,并且可以顺序执行多个操作。

函数的链式访问的实质是把一个函数的返回值作为另外一个函数的参数,由此可见,使用函数的链式访问的前提是函数要有返回值。

下面写一个简单的例子方面理解,如下:

#include<stdio.h>
#include<string.h>
int main()
{
	int len = strlen("abcdef");
	printf("len = %d\n", len);
	//使用链式访问
	printf("strlen = %d\n", strlen("abcdef"));

	printf("%d", printf("%d", printf("%d", 43)));

	return 0;
}

运行结果如下:

函数strlen()的返回值是一个size_t类型的整数,表示指定字符串的长度,即字符串中非空字符的个数。

函数printf()的返回值是一个int类型的整数,表示输出的字符数量。如果出现错误,printf()函数返回一个负数,表示输出错误的情况。所以printf("%d", printf("%d", printf("%d", 43)))是先调用printf("%d", 43),输出43,返回值是输出字符的数量,所以printf("%d", 43)的返回值是2,那么printf("%d", 2)=2,所以printf("%d", printf("%d", printf("%d", 43)))的返回值是1,最终printf("%d", printf("%d", printf("%d", 43)))=4321。

链式访问通常使用返回类型为对象或结构体的函数,并且这些函数都返回对象或结构体的指针或引用。通过在一个函数中调用另一个函数,并将返回值再作为下一个函数的参数,可以实现函数的链式调用。

例如,假设有一个名为Vector的结构体,表示二维向量,包含成员变量x和y,以及一些操作函数:

#include <stdio.h>

typedef struct {
    int x;
    int y;
} Vector;

Vector* createVector(int x, int y) {
    Vector* vector = (Vector*)malloc(sizeof(Vector));
    vector->x = x;
    vector->y = y;
    return vector;
}

Vector* add(Vector* vector1, Vector* vector2) {
    Vector* result = createVector(vector1->x + vector2->x, vector1->y + vector2->y);
    return result;
}

Vector* multiply(Vector* vector, int scalar) {
    Vector* result = createVector(vector->x * scalar, vector->y * scalar);
    return result;
}

void printVector(Vector* vector) {
    printf("Vector: (%d, %d)\n", vector->x, vector->y);
}

int main() {
    Vector* vector1 = createVector(1, 2);
    Vector* vector2 = createVector(3, 4);
    
    Vector* sum = add(vector1, vector2);
    Vector* scaled = multiply(sum, 2);
    
    printVector(scaled);
    
    free(vector1);
    free(vector2);
    free(sum);
    free(scaled);
    
    return 0;
}

上述代码中,通过createVector函数创建了两个向量(vector1和vector2),然后使用add函数将它们相加得到一个新的向量(sum),再使用multiply函数将sum向量乘以一个标量得到最终结果(scaled),最后通过printVector函数打印结果。

运行结果如下所示:

通过函数的链式访问,可以实现对向量对象的一系列操作,代码更简洁易读。需要注意的是,在使用链式访问时需要管理内存,确保及时释放不再需要的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华彩38载 同心筑未来—中华财险客户节盛大启幕!

活动主题&#xff1a;华彩38载 同心筑未来—中华财险客户节金融知识有奖问答 活动时间&#xff1a;2024年7月26日至9月15日 参与方式&#xff1a;① 微信搜索并关注公众号“中华财险宁波分公司”进入答题活动页面&#xff0c;点击“开始答题”即可开始答题&#xff1b;②规定…

ComfyUI-MuseTalk部署依赖mmcv

ComfyUI-MuseTalk部署依赖mmcv ComfyUI-MuseTalk是MuseTalk基于ComfyUI的自定义节点插件。MMPose 是一款基于 PyTorch 的“人体姿态”分析的开源工具箱&#xff0c;是 OpenMMLab 项目的成员之一。OpenMMLab 团队致力于构建了深度学习时代最具影响力的开源计算机视觉算法系统&am…

【C++标准库】介绍及使用string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数&#xff08;constructor&#xff09;2.析构函数&#xff08;destructor&#xff09;3.运算符重载&#xff08;operator&#xff09;1.operator2.operator[]3.operator4.operator 4.string的四…

SecureCrt设置豆沙绿

绿豆沙色能有效的减轻长时间用电脑的用眼疲劳&#xff01; 色调&#xff1a;85&#xff0c;饱和度&#xff1a;123&#xff0c;亮度&#xff1a;205&#xff1b;RGB颜色红&#xff1a;199&#xff0c;绿&#xff1a;237&#xff0c;蓝&#xff1a;204&#xff1b; 十六进制颜色…

3步阐述搜索框做了什么事情

搜索功能是几乎每个产品的通用标配功能&#xff0c;一个看似简单的搜索框背后&#xff0c;其实隐含了大量的设计思考和技术壁垒。本文将从三个部分阐述&#xff0c;为何搜索框并不简单。 本文将从搜索场景的思考、基于步骤的搜索设计以及搜索数据的追踪3个部分&#xff0c;对产…

今日arXiv最热大模型论文:北京大学最新综述:视觉大模型中的漏洞与攻防对抗

近年来&#xff0c;视觉语言大模型&#xff08;LVLM&#xff09;在文本转图像、视觉问答等任务中大放异彩&#xff0c;背后离不开海量数据、强大算力和复杂参数的支撑。 但是&#xff01;大模型看似庞大的身躯背后却有一颗脆弱的“心脏”&#xff0c;极易受到攻击。攻击者可以…

史上最全,网工必考证书大盘点,竟然有20多个?

最近很多朋友来咨询&#xff0c;作为网工能考什么证书&#xff1f;证书那么多要怎么选择&#xff1f;哪个性价比高、哪个回报大等等等等的问题。 不难看出&#xff0c;大家最近这个想要学习和提升的势头很猛&#xff0c;毕竟现在这个环境下&#xff0c;属实是不好过了&#xff…

FPGA开发——数码管的使用(二)

一、概述 在上一篇文章中我们针对单个数码管的静态显示和动态显示进行了一个设计和实现&#xff0c;这篇文章中我们针对多个数码管同时显示进行一个设计。这里和上一篇文章唯一不同的是就是数码管位选进行了一个改变&#xff0c;原来是单个数码管的显示&#xff0c;所以位选就直…

Android Studio运行报错:module java.base dose not “opens java.io“ to unnamed module

今天第一次使用Android Studio运行一个安卓工程&#xff0c;报如图错误,应该是环境问题。 解决&#xff1a; 右上角的设置图标->settings->Buid,Execution,Deployment->Build Tools->Gradle->Gradle JDK->选择本地环境的java_home jdk&#xff08;怎么安装…

docker镜像不可用

现在阿里、163等docker镜像基本不能使用&#xff0c;不能pull镜像了。 1.腾讯云内部 腾讯云服务器内部可用镜像&#xff08;当然&#xff0c;需要先有一个腾讯云服务器&#xff09;&#xff1a;https://mirror.ccs.tencentyun.com 配置方法&#xff0c;vi /etc/docker/daemon…

C++—— IO流

一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()和printf()。 scanf()&#xff1a;从标准输入设备&#xff08;键盘&#xff09;中读取数据&#xff0c;并将值存放在变量中。 printf()&#xff1a;将指定的文字/字符串输出到标准输出设备&#xff08;…

Python 聊天机器人项目-8-学习使用 NLTK 和 Keras 构建您的第一个聊天机器人

一、前言 该文章仅作为个人学习使用 二、正文 项目源代码&#xff1a;Python 聊天机器人项目 - 学习使用 NLTK 和 Keras 构建您的第一个聊天机器人 - DataFlair (data-flair.training) 数据集&#xff1a;https://data-flair.training/blogs/download-python-chatbot-data-…

Web3时代:科技与物联网的完美结合

随着信息技术的不断进步和物联网应用的普及&#xff0c;Web3技术作为下一代互联网的重要组成部分&#xff0c;正逐渐与物联网技术深度融合&#xff0c;共同开创了新的科技时代。本文将深入探讨Web3技术与物联网的结合&#xff0c;探索它们如何共同推动未来科技发展的新趋势和应…

【32单片机篇】项目:智能排队控制系统

一、项目需求 1. 红外传感器检测有人通过并计数&#xff1b; 2. 计数值显示在LCD1602&#xff1b; 3. 允许通过时&#xff0c;LED1闪烁&#xff0c;蜂鸣器不响&#xff0c;继电器不闭合&#xff1b; 4. 不允许通过时&#xff0c;LED2闪烁&#xff0c;蜂鸣器响&#xff0c;继电…

工信部:2024上半年我国信息安全领域收入909亿元

2024年上半年软件业经济运行情况 上半年&#xff0c;我国软件和信息技术服务业&#xff08;以下简称“软件业”&#xff09;运行态势良好&#xff0c;软件业务收入和利润均保持两位数增长&#xff0c;软件业务出口收入增速由负转正&#xff0c;主要大省持续向好发展。 一、总…

光纤基础科普

这部分主要介绍光纤的常见接口&#xff08;四种&#xff09;、光纤传输的种类、光模块的封装类型。 文章目录 一、光纤的常见接口二、光模块封装三、光纤传输种类 一、光纤的常见接口 光纤接口种类繁多&#xff0c;这里给出常用的四种 &#xff08;1&#xff09;SC 型光纤接…

C++静态成员变量和静态成员函数

演示代码如下&#xff1a; #include<iostream> using namespace std;class Person { public://静态成员函数 所有对象共享一个函数&#xff0c;且只能调用静态成员变量 ******static void func(){m_A 300;cout << "静态成员函数调用" << endl;}/…

Charles抓包工具系列文章(七)-- Rewrite工具的应用示例

一、背景 客户端通过域名访问后端服务,在api网关层,会判断path的前缀,默认/api开头的请求都转发至后端服务A。 当前缀是/assist/api开头,请求将转发至后端服务B(部署在192.168.80.226,便于测试对比) 在不改动kong网关配置的情况下,现需要把后者的请求转发至192.168.…

RxJava基础使用

Rx思想 事件从起点流向终点。 过程中可以对事件进行拦截&#xff0c;拦截时可以对事件进行处理&#xff0c;处理后将处理后的事件继续流向终点。 终点接收上一次处理后的事件。 获取网络图片并显示 基础实现 使用Observable.just(path) 创建图片路径的Observable。 使用m…

reshape函数及MATLAB应用

reshape 函数在 MATLAB 中是一个非常有用的函数&#xff0c;通过重新排列现有元素来重构数组。它允许你重新调整数组&#xff08;或矩阵&#xff09;的尺寸&#xff0c;而不改变其数据。这个函数特别适用于当你需要将一个矩阵或数组从一种结构转换为另一种结构时&#xff0c;只…