为什么 C 中的函数 return 是一条语句?

SLN*_*SLN 16 c statements

一个表达式产生一个值,语句改变机器的状态,也就是副作用。但是,我一直在读那个函数 return 是一个声明。如果我调用一个返回空值的函数,这将如何改变机器的任何状态?或者,如果我调用一个返回非空值的函数,如果我不使用它而只是调用它,这将如何改变任何状态?

我只是不明白为什么返回是一个声明?

资料来源:编程语言中的概念。剑桥:剑桥大学出版社,3.4.1 Statements and Expressions,p。26

Lou*_*nco 12

它改变了调用堆栈和程序计数器。它将返回值放在一个已知的地方(取决于调用约定)

即使您不使用返回值,编译器仍需要将其存储在某处,因为它可能会从未知的不同编译器单元中调用。

  • @einpoklum:是的。这个答案说它改变了**调用堆栈**,而不是**硬件堆栈**。C 标准为函数调用定义的语义(先进后出)构成了称为堆栈的抽象数据结构的行为。AC 实现必须至少以有限的方式实现某种形式的堆栈。 (4认同)
  • C 是否有一个强制堆栈存在的机器模型? (2认同)

Joh*_*ode 10

语句改变机器的状态

除非他们不这样做。C 中有没有副作用的语句。

一个语句也是一种句法结构——它不是关于它是否有副作用,而是关于它在语言语法中的位置。


Adr*_*ica 5

当程序运行时,CPU 需要跟踪它在代码中的位置。这是使用“寄存器”完成的,该寄存器被称为程序计数器指令指针地址寄存器或许多其他类似名称中的任何一个。

这里的值,就像任何其他寄存器或内存位置中的值一样,构成了“机器状态”的一部分。此外,它可能是关于运行程序的最重要的“状态”。

当您的程序执行一条return语句时,此“地址寄存器”中的值将更改为与调用您正在返回的函数之后紧接的代码段相对应的值。

return语句还(几乎总是)更改了许多其他构成机器状态的寄存器;例如,堆栈指针(如果使用)将在调用函数之前重置为其值。


注:我有严重过于简化了调用(和返回)这里的函数CPU级的,运行时间力学; 然而,“示例”有望说明该return语句必须影响“机器的状态!”这一点。