问题初始

int select(int arr[],int left,int right,int target){if(left>right)return -1;      // 没找到 int mid=left+(right-left)/2;if(arr[mid]==target){return mid;                     //  存入 寄存器中。}else if(arr[mid]>target){select(arr,left,mid-1,target);}else{select(arr,mid+1,right,target);}
}

昨天突然意识到,这个函数返回值并不是靠 return 直接给到的,但是结果依然是正确输出的,所以 查点资料 弄明白一些。

对 void 型

void func(){}
1.return -1;             // [Error] return-statement with a value, in function returning 'void' [-fpermissive]
函数体内可以有 return ,但不能 with a value。
2.int b=func(a,0,4,28);        // [Error] void value not ignored as it ought to be
不能进行赋值
3.cout<<func(a,0,4,28);       // [Error] no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'void')
也不能进行输出

对非 void 型

无论 函数体内 有无 return ,都可进行赋值

int k=func(10);         // OK, func 是一个 non-void 的函数
  • 如果有return,return 后边必须跟一个 值
int func(int a){int b=9;return ;        // [Error] return-statement with no value, in function returning 'int' [-fpermissive]
}
当 我们 在进行 return 27; 的时候, 对应的汇编 是 mov eax,27 (向eax寄存器存 27)
  • 如果函数体内没有 return,以及 有return,但因为分支结构等原因 , return语句没有执行到,此时 函数的返回值
函数体内 没有 return
int func(int a){int b=9;int x=23;
}cout<<func(10)<<endl;      // 传入常量,函数返回值 不定cout<<func(10)<<endl;int m=9;cout<<func(m)<<endl;                      // 传入变量,返回 eax 寄存器 中的值(本例中 是 实参 m 的值)cout<<func(10)<<endl;cout<<func(m)<<endl;输出结果:              在另一台机器
0                       1
4710240                 4745728
9                       9
4710240                 4745728
9                       9

对于 函数体内 无return时的返回值

返回值取决于确切的平台,可能是程序集级别返回寄存器(例如 x86 上的 EAX)中发生的任何随机值。
C function defined as int but having no return statement in the body still compiles
Technically, if a non-void function returns without a value and the function’s return value is used, the behavior is undefined (C99 §6.9.1/12) – it might return a random value, it could crash, etc. On x86, it will probably just use whatever junk is in the EAX register. But on other architectures, such as IA64, uninitialized garbage could be deadly. – Adam Rosenfield

从技术上讲,如果非空函数返回没有值并且使用了函数的返回值,则行为未定义(C99 §6.9.1/12)——它可能返回一个随机值,它可能会崩溃等。在 x86 上 ,它可能只会使用 EAX 寄存器中的任何垃圾。 但是在其他架构上,例如 IA64,未初始化的垃圾可能是致命的。 — 亚当·罗森菲尔德


eax 里是什么 ?

可以是 函数参数的值

函数调用的时候的会将实参从右向左依次入栈

如果传入的参数是变量,则依次放在eax寄存器中,根据上面的入栈顺序,就是说eax中保存的是函数第一个参数的值(但是,实际我测试的并不完全是第一个参数,也可以是其他位置);
如果传入的参数是常量,则不会使用eax寄存器。

可以是 return 右边的值

如果,函数执行过程中,碰到了 return,使用return关键字会将右边表达式的结果保存在eax寄存器中,如果不写return,则eax中可能是之前传入参数的值,也可能是上一次return的值,看情况分析。
函数不写return以及调用无参函数时传参会出现什么结果


一般返回值在 EAX 寄存器
没将返回值写到eax中,但调用者依旧去读取eax的值,谁也不知道是个啥
总之,还是写规范一点吧。例如,对开始的代码进行修改:

int select(int arr[],int left,int right,int target){if(left>right)return -1;      // 没找到 int ret;int mid=left+(right-left)/2;if(arr[mid]==target){return mid;                     //  存入 寄存器中。}else if(arr[mid]>target){ret=select(arr,left,mid-1,target);}else{ret=select(arr,mid+1,right,target);}return ret;
}

函数的return,返回值相关推荐

  1. function 函数和return返回值

    function 函数和return返回值 可以用来封装代码,它里面的代码不会立即执行 需要使用 函数名() 来调用里面的代码 语法:function 函数名 ([形参1,形参2,.....形参n]) ...

  2. Python函数常见return返回值类型

    Python函数常见return返回值类型Python函数return返回值类型主要包括: class 'int', class 'str', class 'tuple', class 'list', ...

  3. Python基础学习_函数数def_返回值及返回值类型_函数块

    一. 返回值 函数作用:显示输出.处理数据并返回数据结果 函数返回值的定义:函数返回值被称为返回值 写法: 函数体内 return 返回值 (将值返回到调用函数的代码行) 返回值类型: "& ...

  4. python怎么让输出结果为01_python函数基础-参数-返回值-注释-01

    什么是函数 函数就是有特定功能的工具 #python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分 为什么要用函数 #可以减少代码冗余,增加代码复用性#使代码逻辑更 ...

  5. python中return返回值为函数名_Python函数返回值

    Python函数返回值教程 同时,Python 函数的返回值不需要在函数的签名上体现,只需要在函数体里面直接使用 return 语句返回即可. Python函数不返回值详解 语法 def func_n ...

  6. python return返回值_Python return语句 函数返回值

    return语句是从python 函数返回一个值,在讲到定义函数的时候有讲过,每个函数都要有一个返回值.Python中的return语句有什么作用,今天就来仔细的讲解一下. python 函数返回值 ...

  7. python没有return语句的函数将返回_为什么Python没有return返回值

    为什么Python没有return返回值 发布时间:2020-08-24 17:12:18 来源:亿速云 阅读:118 今天就跟大家聊聊有关为什么Python没有return返回值,可能很多人都不太了 ...

  8. 0717Python总结-return返回值,全局及局部变量,函数名的使用,函数的嵌套,nonlocal修改局部变量,及locals和globals

    一.return 返回值 自定义函数的返回值,return 可以把值返回到函数的调用处 (1) return + 六大标准数据类型 , 还有类和对象,函数 如果不定义return , 默认返回的是No ...

  9. R语言return返回值的形式实战

    R语言return返回值的形式实战 目录 R语言return返回值的形式实战 #包含return的R函数 #不包含return的R函数

  10. C++ 函数的引用返回值

    C++ 函数的引用返回值 2009-09-17 09:29 引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递.它的最大好处是可以把别处对变量的改变保留下来,第二好处是它提高了性能:如果函数 ...

最新文章

  1. 2017各银行贷款利息表及P2P平台贷款利率比较
  2. Wix安装程序中判断是否安装的.net framwork 4.5
  3. [转]inux Kernel部分选项意义
  4. socket绑定的ip为INADDR_ANY 的意义 htonl(INADDR_ANY)(0.0.0.0所有地址、不确定地址、任意地址)(htonl和htons区别)
  5. 【完结】史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(四)
  6. 单链表的按位置插入和删除
  7. 大数据会如何影响VC领域?
  8. apktool 在mac下的使用 -反编译安卓apk文件
  9. java后台常用设计模式_Java中几个常用设计模式
  10. 烂大街的常用Linux命令、工具
  11. P4888 三去矩阵
  12. iOS-Senior19-FMDB第三方应用
  13. Maven最佳实践:管理依赖
  14. 创建FB-定义接口(基础版)
  15. 【C语言】求1*2*3*4*5
  16. 计算机生命科学研究系,生命科学与计算机科学的结合发展研究
  17. acwing1113 红与黑
  18. 2020中国项目经理视频直播大会成功举办
  19. 28.找出字符串中第一个匹配项的下标
  20. 你知道吗?U盘插入速度决定读写速度,看完别再用错了

热门文章

  1. mysql数据库中针对敏感信息字段加密处理问题
  2. App调试之夜神模拟器
  3. python的含义和用法_python中列表的含义及用法
  4. RocketMQ一:快速入门和集群架构
  5. java练手项目_20个Java练手项目,献给嗜学如狂的人
  6. HP中国区总裁离职感言[转]
  7. Azure Endpoint 解析
  8. 【东北师范大学】考研初试复试资料分享
  9. Camtasia studio2023电脑全屏录像机下载
  10. ROS节点中创建msg和srv文件(kinetic/melodic)