为什么在c ++中的return语句后执行会停止?

时间:2015-09-05 18:30:27

标签: c++

可以说语句在return语句之前执行。 在8085汇编程序中,RET语句将程序计数器返回到主程序中函数调用之后的下一条指令。

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

这是一个缺点吗?

1 个答案:

答案 0 :(得分:4)

C中return语句的semantics是将控制权交给调用者(如果给定)某些返回值(被调用函数的结果)。您可能会阅读call stackscontinuations以了解更广泛的情况。

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

  

return语句终止当前函数的执行并将控制权返回给   它的来电者。函数可以包含任意数量的return语句。

     

如果执行带有表达式的return语句,则表达式的值为   作为函数调用表达式的值返回给调用者。如果表达式有   类型不同于它出现的函数的返回类型,值为   通过赋值给具有函数返回类型的对象进行转换。

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

n3797标准的C++14草案在§6.6.3中特别说明:

  

函数通过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

ABIcalling conventions指示如何返回值。在Linux/x86-64上,它经常通过%rax寄存器传递(通常,当您返回两个标量的struct时,它会通过两个寄存器返回)。

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

C语言很难用,而C ++则更难。如果您正在学习编程,则可以使用Scheme了解SICP。它只有表达式,不需要任何return 语句(因为它没有语句!)从函数返回一个值。