可以说语句在return语句之前执行。
在8085汇编程序中,RET
语句将程序计数器返回到主程序中函数调用之后的下一条指令。
为什么会这样?如果我想在将值返回给函数后更改实例变量的值,该怎么办?
这是一个缺点吗?
答案 0 :(得分:4)
C中return
语句的semantics是将控制权交给调用者(如果给定)某些返回值(被调用函数的结果)。您可能会阅读call stacks和continuations以了解更广泛的情况。
return语句终止当前函数的执行并将控制权返回给 它的来电者。函数可以包含任意数量的return语句。
如果执行带有表达式的return语句,则表达式的值为 作为函数调用表达式的值返回给调用者。如果表达式有 类型不同于它出现的函数的返回类型,值为 通过赋值给具有函数返回类型的对象进行转换。
在C ++中,事情是不同的,因为调用了析构函数(范围内所有构造的本地值)。但return
执行后没有明确的陈述。
函数通过return语句返回其调用者。
既没有表达式也没有braced-init-list的return语句只能用于没有表达式的函数 返回一个值,即返回类型为cv void的函数,构造函数(12.1)或析构函数(12.4)。 表达式为非void类型的return语句只能用于返回值的函数;该 表达式的值返回给函数的调用者。表达式的值是隐式的 转换为它出现的函数的返回类型。返回声明可能涉及到 构造和复制或移动临时物体(第12.2节)。
....等....(析构函数在别处解释)
C和C ++是不同的语言。您需要阅读C编程和/或websites上的相关书籍或C++ programming。
不要指望在论坛中教授return
的所有细微差别。阅读书籍,然后使用代码示例询问一些精确问题。不要忘记在您的计算机上测试您的代码,例如通过编译所有警告和调试信息(例如,对于C代码gcc -Wall -Wextra -g
,对于C ++代码编译g++ -Wall -Wextra -g
,如果使用GCC进行编译...)。然后使用调试器(例如gdb
)逐步运行您的程序。要害怕undefined behavior。
optimizing compiler并不总是将return
源语句编译为RET
machine instruction。它可以内联函数调用,或者将return
- s编译为跳转到function epilogue。
ABI和calling conventions指示如何返回值。在Linux/x86-64上,它经常通过%rax
寄存器传递(通常,当您返回两个标量的struct
时,它会通过两个寄存器返回)。
您可以要求编译器(例如g++ -O -Wall -fverbose-asm -S
)生成汇编代码,并使用编辑器或寻呼机进行查看。
C语言很难用,而C ++则更难。如果您正在学习编程,则可以使用Scheme了解SICP。它只有表达式,不需要任何return
语句(因为它没有语句!)从函数返回一个值。