执行和评估有什么区别?

16

我们说表达式“evaluate(求值)”值,语句命令计算机“执行”。但在我看来,这似乎是相同的术语。在C语言中,执行和评估有什么区别?


1
这差不多是一样的东西,不必在意这些英语细微差别。 - Jabberwocky
4个回答

7

这几乎在所有情况下都足够接近而不会有所影响。

如果我们要非常精确的话,我会说评估会生成一个结果值,并且不会改变状态,而执行会改变状态,结果值要么没有产生,要么是附带的并被忽略了。

一般来说,我们评估表达式,执行语句。

例如,在 C 中,如果有一个 if 语句,我们首先评估条件,然后执行(或不执行)主体。

混淆的原因是因为在 C 中我们有可以改变状态的表达式(赋值运算符、增量/减量运算符),以及仅仅是表达式的语句。

所以当你看到

a = b+c;

在C语言中,它是一种会被执行的语句,但其执行实际上是对表达式a=b+c进行求值,其中结果(非常量引用a)会被丢弃,而副作用(a的值发生改变)则非常重要。

评估开始时间是什么时候?在执行之前、之后还是同时进行? - haccks
评估是执行的一部分 - 有时是唯一的部分。 - user3458

5
这只是语言学问题。表达式会被计算,语句则会执行。无论哪种情况,我们都可以说“完成了某些事情”,我不会过分担心它们之间的区别。
为了澄清一下:大致上来说,语句是一行代码,而表达式是你可以在 if()while() 括号中找到的内容,或者等号右边的内容。
例如,int x = 2 + 3; 是一个声明变量 x 并将表达式 2 + 3 的结果(即 5)赋值给它的语句。

x = y + z; 这个表达式中有多少个表达式?第二段是误导性的。 - haccks
但是 int x = 2 + 3 是一个表达式。 - Bauss
@haccks:我认为在第三段中我解释了我的意思。我不是要100%准确,而是以一种简单易懂的方式来解释事情。在你的例子中,技术上yz都是表达式,但如果它们是函数,比如x = y() + z();,那么称它们为表达式可能更有意义。如果它们是数字,在我看来称它们为表达式似乎有些过头了。在这个特定的上下文中,我不会说整行代码是一个表达式,因为这只会让人感到困惑。我试图展示表达式和指令之间的区别。说某件事既是表达式又是指令并没有帮助。 - Fabio says Reinstate Monica
@Bauss 我猜我的上一条评论也适用于你。顺便说一下,我已经重新措辞以澄清“大致”不仅适用于第一句话,而是适用于两个句子。也就是说,我给出的表达式定义也是粗略的。再次强调,我试图让事情简单化,而不是准确。话虽如此,从OP那里听到一些消息会很好... - Fabio says Reinstate Monica
@FabioTurati;以分号结尾的表达式是一个语句。除非我在编写/阅读汇编代码,否则我不会称它们为指令。 - haccks
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Fabio says Reinstate Monica

4
当语句被执行时,它的表达式将被评估。首先执行语句,然后进行表达式的评估。
在代码片段中。
int i = 5, j;
j = 10 + 5*i;

当执行语句j = 10 + 5*i;时,会对表达式j105*i10 + 5*ij = 10 + 5*i进行求值。注意前三个表达式可以按任意顺序进行求值。

1
首先执行,然后评估。您是指这些过程开始的时间吗?还是结束?它们在时间上重叠吗?还是彼此互斥? - CinCout
@CinCout; 为了更清晰,添加了一个示例。 - haccks
1
@haccks 感谢您的回答!当执行发生时,编译器内部会发生什么? - Jin

1
我想到的方式是:术语“表达式”源自数学术语。评估被定义为:
评估是找到数字或代数表达式的值。
表达式有以下定义:(为了强调已加粗)
在编程语言中,表达式是一个或多个显式值、常量、变量、运算符和函数的组合,编程语言根据其特定的优先级和关联规则进行解释,并计算以产生另一个值(在有状态环境中“返回”)。
在编程中,几乎每个语句(或值得编写的语句)都由许多表达式组成。我一直使用“评估”一词来指代这些表达式的计算,并使用“执行”一词来指代整个语句的计算。这通常与返回值和副作用的区别相吻合。完整的语句通常具有副作用,而表达式通常返回某种值。

谢谢你的回答,rhmh!顺便问一下,执行是在表达式求值之前发生的吗? - Jin
1
@jwqwerty 我对编译器语义不是很熟悉,但如果一个表达式是语句的一部分,它必须被评估才能执行函数。然而,可以说通过评估组件已经开始执行。我会说评估发生在执行期间,而不是之前或之后。 - rtmh

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