为什么C语言中函数返回值是一个语句?

16
表达式生成一个值,语句改变机器的状态,也就是产生了副作用。然而,我一直在阅读函数返回值是一个语句。如果我调用一个返回空值的函数,那么这会如何改变机器的状态呢?或者说,如果我调用一个返回非空值但不使用它的函数,那么这将如何改变任何状态?
我就是不明白为什么“return”是一个语句?
来源:《编程语言概念》第3.4.1节 语句和表达式, 第26页,剑桥大学出版社

10
请问您愿意引用类似“语句会改变机器状态”这样的泛泛而谈的说法的来源吗?例如,考虑if(0) abort();,它确实是一个C语句。简短的回答是,return是一个语句,因为编程语言定义它如此。请引用那些泛泛而谈的陈述(例如“语句会改变机器状态”)的来源。例如,考虑if(0) abort(); 这个语句确实是一个C语句。简单来说,return是一个语句,因为编程语言将其定义为语句。 - dxiv
7
这是无意义的。有许多声明没有副作用。 - Nate Eldredge
4
你想太多了。 - selbie
2
另一方面,您可以考虑程序流程是机器状态的一部分(例如其程序计数器)。return语句肯定会改变这种状态。 - Nate Eldredge
4
这里我想充当一下“恶魔的代言人”(或者类似的角色):return 是一个语句还是关键字?毫无疑问,return;(请注意第七个字符)是一个语句。 - Adrian Mole
显示剩余3条评论
3个回答

12

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

即使您不使用返回值,编译器仍然需要将其存储在某个地方,因为它可能被未知的不同编译器单元调用。


2
C语言是否有一个机器模型,它要求堆栈必须存在? - einpoklum
4
是的。这个答案说它改变了**调用栈(call stack),而不是硬件栈(hardware stack)**。C标准为函数调用定义的语义——先进后出——构成了一个抽象数据结构称为栈的行为。 C实现必须以至少有限的方式实现某种形式的栈。 - Eric Postpischil
1
@einpoklum 是和不是。这取决于你所说的“堆栈”是什么意思。对于具有自动存储期限(在函数内定义的非静态对象)的对象,必须存在某种先进后出的结构。但是,并没有要求将此结构作为一段从一端增长和缩小的连续内存来管理。 - Keith Thompson

10

语句可以改变机器的状态

但并非所有语句都会改变状态,在C语言中有一些语句没有副作用。

语句也是一种语法结构 - 它与是否具有副作用无关,而是与它在语言语法中的位置有关。


5
当程序运行时,CPU需要跟踪代码的位置。这是通过一个称为“寄存器”的东西来完成的,它被称为程序计数器指令指针地址寄存器或其他类似名称之一。
与任何其他寄存器或内存位置中的值一样,这个值构成了“机器状态”的一部分。此外,它可能是关于运行程序最重要的“状态”。
当您的程序执行return语句时,这个“地址寄存器”中的值会改变,变成对应于从中返回的函数调用后紧随其后的代码片段的值。

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


注意:我在这里极度简化了涉及调用(和返回)函数的CPU级别、运行时机制;然而,“示例”将有望说明return语句必须影响“机器的状态!”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接