函数的多个返回标志

.text:00401000 ; int __cdecl wmain(int argc, wchar_t **argv)
.text:00401000 _wmain          proc near               ; CODE XREF: __tmainCRTStartup+11Dp
.text:00401000
.text:00401000 m               = dword ptr -4
.text:00401000 argc            = dword ptr  8
.text:00401000 argv            = dword ptr  0Ch
.text:00401000
.text:00401000                 push    ebp
.text:00401001                 mov     ebp, esp
.text:00401003                 and     esp, 0FFFFFFF8h
.text:00401006                 sub     esp, 8
.text:00401009                 mov     ecx, ds:std::basic_istream<char,std::char_traits<char>> std::cin
.text:0040100F                 lea     eax, [esp+8+m]
.text:00401013                 push    eax
.text:00401014                 call    ds:std::basic_istream<char,std::char_traits<char>>::operator>>(int &)
.text:0040101A                 cmp     [esp+8+m], 0
.text:0040101F                 jle     short loc_40103B
.text:00401021                 mov     ecx, ds:std::basic_ostream<char,std::char_traits<char>> std::cout
.text:00401027                 push    offset _Val     ; "dsadasdasda\n"
.text:0040102C                 push    ecx             ; _Ostr
.text:0040102D                 call    std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const *)
.text:00401032                 add     esp, 8
.text:00401035                 xor     eax, eax
.text:00401037                 mov     esp, ebp
.text:00401039                 pop     ebp
.text:0040103A                 retn;函数的结束标志,但是其后方并不是另一函数的开始。。。
.text:0040103B ; ---------------------------------------------------------------------------
.text:0040103B
.text:0040103B loc_40103B:                             ; CODE XREF: _wmain+1Fj
.text:0040103B                 mov     edx, ds:std::basic_ostream<char,std::char_traits<char>> std::cout
.text:00401041                 push    offset aDiushdaiosdbnh ; "diushdaiosdbnhakls\n"
.text:00401046                 push    edx             ; _Ostr
.text:00401047                 call    std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const *)
.text:0040104C                 add     esp, 8
.text:0040104F                 xor     eax, eax
.text:00401051                 mov     esp, ebp
.text:00401053                 pop     ebp
.text:00401054                 retn
.text:00401054 _wmain          endp;函数的结束标志

#include
  
  
   
   
using namespace std;
int test(int a)
{
	if(a>0)
	{
		cout<<"dsadasdasda\n";
		return 9;
	}
	else
	{
		cout<<"diushdaiosdbnhakls\n";
		return 8;
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int m;
	cin>>m;

	test(m);
	return 0;
}

  
  

这是对应的C++源代码像我们上一节讲的,pop ebp,add esp,..h;和mov esp,ebp; pop ebp 这是函数结束的标志,

在.text:0040103A中有retn,是我们之前说的函数结束标志,但是在其后方的代码并不是函数的起始位置,所以,我们可以知道,该函数有多个出口。

所以标志性的函数结束标志,并不一定是函数的结束地址,可能只是一个函数出口,关键在于在函数结束标志的后面是不是另一函数的开始!!!

在许多编程语言中,默认情况下函数只能返回单个值。然而,我们有多种方式可以让自定义函数返回多个值。 以下是几种常见的实现方法: ### 1. 使用元组 (Tuple) 很多现代编程语言支持直接通过元组来一次性返回多个值。例如,在 Python 中可以直接将多个变量打包成元组并返回: ```python def get_values(): return 10, "hello", True a, b, c = get_values() print(a) # 输出: 10 print(b) # 输出: hello print(c) # 输出: True ``` --- ### 2. 定义数据结构(如字典、类等) 如果需要返回更多复杂的结构化信息,可以考虑使用更高级的数据容器。比如 **Python 的字典** 或者创建一个专门的对象实例作为结果载体。 #### 示例:用字典存储多个返回值 ```python def calculate_results(x, y): sum_ = x + y product = x * y difference = abs(x - y) return {"sum": sum_, "product": product, "difference": difference} result = calculate_results(5, 3) print(result["sum"]) # 输出: 8 print(result["product"]) # 输出: 15 print(result["difference"]) # 输出: 2 ``` #### 示例:使用类封装 当返回的结果之间存在关联意义时,也可以设计一个新的类。 ```python class Result: def __init__(self, sum_, product, diff): self.sum = sum_ self.product = product self.diff = diff def compute_operations(a, b): total_sum = a + b prod_result = a * b absolute_diff = abs(a - b) return Result(total_sum, prod_result, absolute_diff) res_obj = compute_operations(4, 7) print(res_obj.sum) # 输出: 11 print(res_obj.product) # 输出: 28 print(res_obj.diff) # 输出: 3 ``` --- ### 3. 引入指针/引用传递机制 某些低级语言像 C++ 支持通过地址或引用的方式修改外部变量的值,这样虽然表面上只返回单一内容,实际上却能间接达到多重赋值的效果。 示例代码(C++) : ```cpp #include <iostream> using namespace std; void divide(int numerator, int denominator, double& quotient, bool& isValid){ if(denominator != 0 ){ quotient = static_cast<double>(numerator)/denominator; isValid=true; } else{ isValid=false; //设置状态标志位为false表示异常情况发生. } } int main(){ double result; bool validFlag; divide(9 , 0,result,validFlag); cout << ((validFlag)? ("Valid:"+to_string(result)):("Invalid Operation")); return 0 ; } //最终输出" Invalid Operation" ``` 在这里 `divide` 函数借助了两个额外参数实现了同时给出除法运算后的商以及是否合法这两方面的反馈. 综上所述,无论采用哪种手段都各有优劣之处,请依据实际应用场景选择最适合的技术路线吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值