为什么c++中返回语句后执行停止
Why execution stops after return statement in c++?
可以这样说,语句在返回语句之前执行。在8085汇编程序中,RET
语句将程序计数器返回到主程序中函数调用后的下一条指令。
为什么会发生这种情况?如果我想在将值返回给函数后更改实例变量的值,该怎么办?
这是一个缺点吗?
C中return
语句的语义是将控制权返回给调用者(如果给定)一些返回值(被调用函数的结果)。您可以阅读调用堆栈和延续以获得更全面的了解。
C11标准草案n1570§6.8.6.4规定:
在c++中情况有所不同,因为要调用析构函数(作用域中所有构造的局部值的析构函数)。但return语句终止当前函数的执行,并将控制返回给它的调用者。一个函数可以有任意数量的返回语句。
如果执行带有表达式的return语句,则该表达式的值为作为函数调用表达式的值返回给调用者。如果表达式有类型不同于其所在函数的返回类型,则该值为转换为具有函数返回类型的对象。
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
语句(因为它没有语句!)来从函数返回值。
- 如何及时执行if语句?
- 获取上次执行的返回语句的行
- 如何仅在父循环的所有迭代都为真时才执行嵌套的 if 语句?
- 表单显示对话框函数错误,并且不执行下面的语句
- 如何知道调试时执行了哪个语句
- 在可变函数调用中执行一次语句
- 在多个对象上执行同一语句的零成本抽象
- 我怎样才能接受输入作为双精度值并执行 IF ELSE 语句
- c++:if 语句无法正常运行,并继续执行无效输出
- 为什么 cout 语句在传递指向函数的指针时没有执行?
- c++ IF 语句执行,但添加 ELSE 会显示错误
- C 程序如果功能中的语句不执行.在逻辑上似乎是错误的
- 当您希望在Arduino Uno编程中同时执行不同函数时,使用什么代码/语句
- OR 语句执行所有评估
- C++ Switch 语句在中断后执行
- 强制执行C++语句顺序
- SQLITE 内存不足 无法执行语句
- 如何在c++中执行语句
- 如何使用c++/python程序在终端中运行程序,然后在该程序中执行语句
- QODBCResult::exec: 无法执行语句:"[Microsoft][ODBC SQL Server Driver]COUNT 字段不正确或语法错误