Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C中的函数返回是一个语句?_C_Statements - Fatal编程技术网

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

为什么C中的函数返回是一个语句?,c,statements,C,Statements,表达式生成一个值,语句改变机器的状态,也称为副作用。然而,我一直在读函数return是一个语句。如果我调用一个返回一个void的函数,它如何改变机器的任何状态?或者,如果我调用一个返回非void值的函数,如果我不使用它,只是调用它,这会如何改变任何状态 我只是不明白为什么返回是一个语句 来源:编程语言中的概念。剑桥:剑桥大学出版社,3.4.1声明和表达,第页。26它更改调用堆栈和程序计数器。它将返回值放在已知位置(取决于调用约定) 即使不使用返回值,编译器仍需要将其存储在某个位置,因为它可能是从

表达式生成一个值,语句改变机器的状态,也称为副作用。然而,我一直在读函数return是一个语句。如果我调用一个返回一个void的函数,它如何改变机器的任何状态?或者,如果我调用一个返回非void值的函数,如果我不使用它,只是调用它,这会如何改变任何状态

我只是不明白为什么返回是一个语句


来源:编程语言中的概念。剑桥:剑桥大学出版社,3.4.1声明和表达,第页。26

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


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

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

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

当您的程序执行
return
语句时,此“地址寄存器”中的值将更改为与调用要从中返回的函数后的代码段对应的值

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


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

语句改变机器的状态

除非他们没有。C语言中有一些语句没有副作用


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

你愿意引用那些笼统的断言的来源吗,比如“语句改变机器的状态”?例如,考虑代码< >(0)流产();<代码>这是一个C语句。简而言之,
return
是一个语句,因为这就是语言的含义。这是胡说八道。有很多语句没有副作用。你正在思考它。另一方面,你可以认为程序流是机器状态的一部分(也许是程序计数器)。code>return当然改变了这一点。只是在这里玩“魔鬼代言人”(或类似的游戏):但是
return
是一个语句还是一个关键字?当然,
return(注意第七个字符)是一条语句。C是否有一个机器模型,它甚至要求堆栈存在?@einpoklum:是的。这个答案表示它改变了调用堆栈,而不是硬件堆栈。C标准为函数调用定义的语义由“先进先出”构成了称为堆栈的抽象数据结构的行为。C实现必须至少以有限的方式实现某种形式的堆栈。@einpoklum是和否。这取决于“堆栈”的含义。对于具有自动存储持续时间的对象(函数中定义的非
静态对象),必须有某种先进先出的结构。但不需要将此结构作为从一端开始增长和收缩的连续内存区域进行管理。