C++_自定义函数实现返回两个数中的较小数

本文介绍了如何在C++中使用标准库函数min和max来获取两个整数中的最小值和最大值,并展示了如何自定义这两个函数以及利用模板来增强其通用性。

本文仅仅发布在优快云我的博客:点击打开链接

http://blog.youkuaiyun.com/pythontojava?viewmode=contents

转载请注明出处。

我用的IDE是VS2013.。代码在vc++6.0不能编译,要把int _tmain(int argc, _TCHAR* argv[]) 改成 int main() 。


已知两个int数字,返回其中的较小数。

C++已经有这个函数——min(a,b),返回a,b直接的较小值,如果两者相等返回a。这个函数头文件是<algorithm>。

已知两个int数字,返回其中的较大数。

C++已经有这个函数——max(a,b),返回a,b直接的较小值,如果两者相等返回a。这个函数头文件同上。

用法如下:

#include "stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	int a=2, b=3;
	int c = 4, d = 5;
	cout << min(a,b);
	cout << endl;
	cout << max(c, d);
	cout << endl;
	system("pause");
	return 0;
}

了解详情戳这里点击打开链接

========分割线=============

现在自己定义函数实现这个功能。

#include "stdafx.h"
#include<iostream>
using namespace std;
int min(int value1, int value2)
{	
	//如果value1<=value2,则返回value1,否则返回value2
	return(value1 <= value2?value1 : value2);
}
int max(int value1, int value2)
{
	return(value1 >= value2 ? value1 : value2);
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a=2, b=3;
	int c = 4, d = 5;
	cout << min(a,b);
	cout << endl;
	cout << max(c, d);
	cout << endl;
	system("pause");
	return 0;
}
运行结果:


========分割线=============

现在用函数模板实现min(),max()

函数模板基础讲解在这里:点击打开链接

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
template<typename T>
T min(T value1, T value2)
{
	return(value1 <= value2 ? value1 : value2);
}
template<typename A>
A max(A value1, A value2)
{
	return(value1 >= value2 ? value1 : value2);
}
int _tmain(int argc, _TCHAR* argv[])
{
	cout << min<float>(6.99,9.88);
	cout << endl;
	cout << max<char>('a','A');
	cout << endl;
	cout << max<string>("ABC", "AB");
	cout << endl;
	system("pause");
	return 0;
}
运行结果:



<think>我们正在讨论C语言中如何让自定义函数返回个数。根据用户的问题,他想知道如何实现一个函数返回个数。在C语言中,函数通常只能通过return语句返回一个。但是,我们可以通过以下几种方法来实现返回多个(例如个数): 1. 使用指针参数:通过指针(或地址)将额外的返回传递给调用者。 2. 使用结构体:将需要返回的多个封装在一个结构体中,然后函数返回这个结构体。 3. 使用数组:当返回的多个类型相同时,可以返回数组(但注意数组不能直接返回,通常返回指向数组的指针,但要注意指针指向的内存生命周期)。 4. 使用全局变量:不推荐,因为会破坏函数的封装性。 根据站内引用,引用[2]提到“C语言函数返回”并指出函数可以没有返回(void),但这里我们需要返回。引用[3]展示了返回一个的情况(返回个数中较大的一个)。因此,我们需要扩展这些方法来返回。 下面我将重点介绍种最常用的方法:指针参数和结构体。 方法一:通过指针参数传递(传址调用) 我们可以在函数中使用指针参数,通过指针来修改调用者传递的变量的,这样就能间接返回多个。注意:虽然函数本身只能return一个,但是通过指针参数可以额外传递返回。 示例:写一个函数计算个整数的和与差,并返回个结果。 思路:我们可以定义函数返回其中一个(比如和),然后通过指针参数返回差。或者更常见的做法是,函数本身返回void,个结果都通过指针参数返回。 代码: ```c #include <stdio.h> // 通过指针参数返回个结果 void sum_and_diff(int a, int b, int *sum, int *diff) { *sum = a + b; *diff = a - b; // 注意:这里假设a>=b,否则差可能是负数 } int main() { int x = 10, y = 6; int s, d; // 调用函数,传递个指针(地址) sum_and_diff(x, y, &s, &d); printf("和: %d\n", s); printf("差: %d\n", d); return 0; } ``` 方法二:使用结构体 我们可以定义一个包含个成员的结构体,然后让函数返回这个结构体。这种方法更直观,且避免了指针操作,但需要注意结构体会被拷贝(如果结构体很大,可能会有性能开销,但对于个整数来说可以忽略)。 示例:同样计算个整数的和与差,返回一个结构体。 代码: ```c #include <stdio.h> // 定义结构体类型 struct Pair { int sum; int diff; }; // 函数返回结构体 struct Pair sum_and_diff(int a, int b) { struct Pair res; res.sum = a + b; res.diff = a - b; return res; } int main() { int x = 10, y = 6; struct Pair result = sum_and_diff(x, y); printf("和: %d\n", result.sum); printf("差: %d\n", result.diff); return 0; } ``` 注意:在C语言中,结构体返回传递,即返回的是整个结构体的副本。在C99及以后的标准中,我们可以使用结构体复合字面量来简化代码: return (struct Pair){a+b, a-b}; 方法三:使用数组(仅适用于相同类型) 如果要返回类型相同(比如都是整数),也可以返回数组,但要注意数组不能直接作为函数返回(不能返回局部数组的地址,因为局部数组在函数结束时会被销毁)。所以通常有种做法: a) 动态分配内存(使用malloc)创建数组,然后返回指针,调用者使用后需要free以避免内存泄漏。 b) 将数组作为参数传入(指针),在函数内修改数组的内容。 这里展示第二种做法(传入数组): ```c #include <stdio.h> void sum_and_diff(int a, int b, int res[2]) { res[0] = a + b; res[1] = a - b; } int main() { int x = 10, y = 6; int result[2]; sum_and_diff(x, y, result); printf("和: %d\n", result[0]); printf("差: %d\n", result[1]); return 0; } ``` 总结: 以上三种方法都可以实现返回个数。其中,方法一(指针参数)和方法二(结构体)更为常用,且结构体方法在返回多个不同类型时更灵活。 根据站内引用[^2],函数可以通过return返回一个,但若要返回多个,则需要借助其他机制。我们通过指针或结构体实现了这一目标。 注意:在C++中,我们可以使用引用(&)或元组(tuple)等更高级的特性,但C语言中只能使用上述方法。 最后,生成相关问题。 </think>### C语言自定义函数返回个数的方法 在C语言中,函数通常只能通过`return`语句返回**一个**(如引用[3]所示),但通过以下4种方法可实现返回多个: --- #### 方法1:指针参数(最常用) 通过指针参数修改调用者的变量实现"返回"多个: ```c #include <stdio.h> // 函数定义:通过指针参数返回个结果 void calc_two(int a, int b, int *sum, int *diff) { *sum = a + b; // 修改sum指向的 *diff = a - b; // 修改diff指向的 } int main() { int x = 10, y = 6; int s, d; // 接收结果的变量 calc_two(x, y, &s, &d); // 传入变量地址 printf("和: %d\n差: %d\n", s, d); // 输出: 和:16 差:4 return 0; } ``` - **原理**:传入变量的内存地址(`&s`, `&d`),函数内部通过解引用(`*sum`, `*diff`)直接修改内存[^2]。 - **优点**:内存开销小,效率高。 --- #### 方法2:结构体封装 返回包含多个的结构体类型: ```c #include <stdio.h> // 定义结构体存储个结果 struct Result { int sum; int diff; }; // 返回结构体实例 struct Result calc_two(int a, int b) { return (struct Result){a + b, a - b}; // C99+的复合字面量 } int main() { struct Result res = calc_two(10, 6); printf("和: %d\n差: %d\n", res.sum, res.diff); return 0; } ``` - **优点**:代码清晰,直接通过`return`返回。 - **适用场景**:返回关联性强的数据(如坐标点、复数等)[^3]。 --- #### 方法3:全局变量(不推荐) ```c #include <stdio.h> int g_sum, g_diff; // 全局变量 void calc_two(int a, int b) { g_sum = a + b; g_diff = a - b; } int main() { calc_two(10, 6); printf("和: %d\n差: %d\n", g_sum, g_diff); return 0; } ``` - ⚠️ **缺点**:破坏封装性,易引发不可预知错误,仅限特定场景使用。 --- #### 方法4:动态数组(返回相同类型) ```c #include <stdio.h> #include <stdlib.h> // 返回堆内存数组指针 int* calc_two(int a, int b) { int *res = malloc(2 * sizeof(int)); // 动态分配内存 res[0] = a + b; res[1] = a - b; return res; } int main() { int *result = calc_two(10, 6); printf("和: %d\n差: %d\n", result[0], result[1]); free(result); // 必须手动释放内存! return 0; } ``` - ️ **注意**:需手动管理内存(`malloc/free`),否则导致内存泄漏。 --- ### 总结与选择建议 | **方法** | **适用场景** | **注意事项** | |----------------|----------------------------------|----------------------------------| | 指针参数 | 需高效返回多个独立 | 需传递变量的地址(`&var`) | | 结构体 | 返回逻辑关联数据(推荐) | C99+支持直接返回结构体 | | 全局变量 | 简单测试或特定场景 | 避免在大型项目使用 | | 动态数组 | 返回多个相同类型 | 必须手动释放内存 | > 优先选择**指针参数**或**结构体**方案(代码健壮性高)。若需返回不同类型数据,结构体是最佳选择[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值