2015-09-05 182 views
-5

可以说这些语句是在返回语句之前执行的。 在8085汇编程序中,RET语句将程序计数器返回到主程序中函数调用后的下一条指令。为什么在C++中的return语句后停止执行?

为什么会发生这种情况?如果我想在将值返回给函数后更改实例变量的值,该怎么办?

这是一个缺点?

+5

你能提供样本代码吗? 'return'结束当前函数的执行。 – dman2306

+0

你为什么不澄清你的问题?为什么添加C和C++标签? C没有实例。 – Olaf

+0

您对8085装配不正确。 RET指令将程序计数器返回给调用后的指令;通常是堆栈顶部的地址。所以,我可以有一个function1调用函数2,函数2将返回到function1而不是主程序。 –

回答

4

C语言中return语句的semantics是为控制返回给调用者(如果给定)一些返回值(被调用函数的结果)。您可能会阅读大约call stackscontinuations以获得更全面的信息。

C11标准规定的草案n1570的§6.8.6.4:

return语句终止函数的执行和控制权返回给 它的调用者。一个函数可能有任何数量的返回语句。

如果执行带有表达式的返回语句,则表达式的值是 作为函数调用表达式的值返回给调用者。如果表达式的 类型与其出现的函数的返回类型不同,则该值为 ,就好像通过赋值给具有函数返回类型的对象一样。

在C++中,事物是不同的,因为调用了析构函数(所有构造的局部值的范围)。但return执行后没有明确的陈述。

C++14标准的n3797草案说,在§6.6.3值得注意的是:

函数返回由return语句调用者。

既没有表达也没有支持初始化列表的返回语句只能用于不返回值的函数,即返回类型为cv void的函数,构造函数(12.1),或析构函数(12.4)。 带有非void类型表达式的return语句只能用于返回值的函数;表达式的 值将返回给函数的调用者。该表达式的值隐含地转换为其出现的函数的返回类型 。 return语句可能涉及构建和复制或移动临时对象(第12.2节)。

....等....(析构函数的事情是在别处说明)


C和C++有不同的语言。您需要阅读C程序和/或C++ programming上的相关书籍或websites

不要指望在论坛中教return的所有缺点。阅读书籍,然后用代码示例询问一些精确问题。不要忘记在您的计算机上测试您的代码,例如通过编译所有警告和调试信息(例如,对于C代码为gcc -Wall -Wextra -g,对于C++代码为g++ -Wall -Wextra -g,如果使用GCC进行编译...)。然后使用调试器(例如gdb)逐步运行程序。害怕undefined behavior

optimizing compiler并不总是将return源语句编译为RETmachine instruction。它可以内联函数调用,或编译return -s跳转到function epilogue

ABIcalling conventions规定如何返回一个值。在Linux/x86-64它通常通过%rax注册(通常,当您返回两个标量的struct,它通过两个寄存器返回)。

您可以让您的编译器(例如g++ -O -Wall -fverbose-asm -S)生成汇编代码,并使用编辑器或寻呼机查看它。

C是一种困难的语言,而C++更加困难。如果您正在学习编程,您可能会通过SICP了解Scheme。它只有表达式,并且不需要任何return语句(因为它没有语句!)从函数返回值。

+0

x85 asm命令与x86不同? – MaMba

+0

是的。 [8085](https://en.wikipedia.org/wiki/Intel_8085)是一个旧的8位微控制器(AFAIK它几乎消失了,大多数8位控制器 - 例如便宜的洗衣机)是不同的,例如PIC, AVR,8051,...)。您的笔记本电脑或台式机可能有一些[x86-64](https://en.wikipedia.org/wiki/X86-64),一个64位处理器。您的平板电脑或手机可能有一些[ARM](https://en.wikipedia.org/wiki/ARM_architecture) –

+0

'返回得到执行后没有显式语句'意味着我可以在返回后使用引用? – MaMba

相关问题