为什么c++中返回语句后执行停止

Why execution stops after return statement in c++?

本文关键字:执行 语句 c++ 返回 为什么      更新时间:2023-10-16

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

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

这是一个缺点吗?

C中return语句的语义是将控制权返回给调用者(如果给定)一些返回值(被调用函数的结果)。您可以阅读调用堆栈和延续以获得更全面的了解。

C11标准草案n1570§6.8.6.4规定:

return语句终止当前函数的执行,并将控制返回给它的调用者。一个函数可以有任意数量的返回语句。

如果执行带有表达式的return语句,则该表达式的值为作为函数调用表达式的值返回给调用者。如果表达式有类型不同于其所在函数的返回类型,则该值为转换为具有函数返回类型的对象。

在c++中情况有所不同,因为要调用析构函数(作用域中所有构造的局部值的析构函数)。但return执行后没有显式语句

c++ 14标准的n3797草案在§6.6.3中特别指出:

函数通过return语句返回给它的调用者。

既不带表达式也不带带括号的init-list的return语句只能用于不带表达式的函数返回一个值,即返回类型为CV void的函数、构造函数(12.1)或析构函数(12.4)。带有非void类型表达式的return语句只能用于返回值的函数;的表达式的值返回给函数的调用者。表达式的值是隐式的转换为它所在函数的返回类型。return语句可以包含构建、复制或移动临时对象(第12.2节)。

…等…(析构函数在其他地方解释)


C和c++是不同的语言。你需要阅读有关C编程和/或c++编程的相关书籍或网站。

不要指望在论坛上学会return的所有微妙之处。阅读书籍,然后用代码示例问一些精确的问题。不要忘记在你的计算机上测试你的代码,例如,用所有的警告和调试信息编译它(例如,gcc -Wall -Wextra -g用于C代码,g++ -Wall -Wextra -g用于c++代码,如果用GCC编译…)。然后使用调试器(例如gdb)一步一步地运行程序。害怕未定义的行为。

优化编译器并不总是将return源语句编译成RET机器指令。它可以内联函数调用,或者将return -s编译为跳转到函数尾声。

ABI和调用约定规定了返回值的方式。在Linux/x86-64上,它通常通过%rax寄存器传递(通常,当您返回两个标量的struct时,它会通过两个寄存器返回)。

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

C是一门很难的语言,c++更是如此。如果您正在学习编程,您可能会使用SICP学习Scheme。它只有表达式,不需要任何return 语句(因为它没有语句!)来从函数返回值。