表达式和语句之间有什么区别?

Wes*_*ley 9 expression

我知道这可能是重复,但我没有找到足够的答案我的例子.一般来说,语句和表达式之间有什么区别?这是一个我还没有完全区分的区别.我知道通常表达式应该是返回值的任何东西,例如文字或函数.声明通常被称为解释器的命令,例如"打印此类等"或"做......同时".但是,我不明白.

说print是一个表达式是否有意义,因为它是一个打印输入(输入到输出)的函数?另外,人们通常会说x = 1是一个语句,但这不能被认为是一个表达式,其中赋值运算符是一个作用于两个输入的函数,输出是x指的是1?最后,不能像if那样的流量控制结构...否则被认为是一个三参数函数,其中一个其他参数是根据第一个输入的真值返回的,使其成为一个表达式?

我可能很困惑,因为我有LISP的背景,一切都是表达.似乎我不能回避大多数编程结构都是表达式的思想.因此,有人可以解释一个所谓的陈述和表达之间真正的区别吗?

use*_*740 8

表达式语句的定义- 即使存在一个或另一个这样的东西 - 特定于特定语言和描述它的语法.

好吧,我们走吧:

  • 语句是一些"可求值代码" 1不会出现在表达式上下文 ; 和

  • 一个表达式是出现在所得到的值的上下文代码可以通过表达的替代被消耗.

{一个非常宽松的'定义',但没有一种语言.虽然有些语言对于副作用何时可以发生和不会发生是严格的 - 而且没有结果或副作用而执行的代码是无用的 - 我不认为讨论这些是差异的基础.}

例如,让我们看看printfC.这是一个副作用的函数,它返回一个值 ; 通常会忽略返回值.因此printf可以看作是一种陈述

printf("Hello world!");
Run Code Online (Sandbox Code Playgroud)

和一个表达

if (8 == printf("Hello %s!", name)) { // ..
Run Code Online (Sandbox Code Playgroud)

(用的返回类型的函数调用void可以出现在C语句上下文,但是这是由类型系统,而不是强加的解析器).

同样,拿在JavaScript中这两条线x = 1;x = (y = 2);.x = ..是一个陈述,y = 2而是一个产生价值的表达.

在这两个例子中,我们都看到语法生成决定了它是被视为语句还是表达式.

相比之下,Ruby可以将"顶级"赋值视为表达式:

[1].map {|x| x = 2}
Run Code Online (Sandbox Code Playgroud)

现在让我们看一个Python(2.x)的高峰.在这种情况下print是一个声明,这就是为什么这些工作分别不起作用的原因:

print "Look ma, no parenthesis!"
x = lambda y: print "Whoops!"       # invalid, print not an expression
Run Code Online (Sandbox Code Playgroud)

那些if结构 - 这些陈述或表达是什么?同样,它取决于特定的语言.在C和Java中,这些都是明确的陈述:没有办法使用诸如替代值.

另一方面,Scala(和Ruby)允许将这种流控制结构用作表达式,尽管它们也可以作为语句出现:

var emotionalResponse = if (color == "green") {
                          log.cheer()
                          new Cheering()
                        } else {
                          new Tears()
                        }
Run Code Online (Sandbox Code Playgroud)

呼.这很多 - 而且不是很全面.但是,回到可以重新考虑的"定义",当考虑上面的各种例子时:

如果有问题的构造可能发生在需要值的地方(例如,在赋值的右侧,作为函数参数,作为另一个表达式的输入),那么它可以被视为表达式; 并且绝对是在这样的背景下的表达.如果构造出现在无法通过替换访问值的位置,则它(或者更确切地说,可以充当)语句.


1另一类要生成条件的产品是声明,例如C语言中的函数声明或Java中的类定义,并且可以说不是语句; 因为以下内容已经非常分散,所以这是一个很重要的注释.


Jas*_*sen 4

表达式产生一个值,语句执行某些操作。

例如; 在 C 中 return a+5;是一个语句,它退出一个函数,将从表达式派生的值提供a+5给调用者。

print 是表达式还是语句取决于语言。

BASIC 的 print 与函数不同,它是由 sopiler 作为特殊情况处理的东西。类似地,pascal 有writewriteln,这也是特殊情况,而不是函数调用,另一方面,C 有 puts() 和 printf() ,它们都是函数。并允许程序员编写以相同方式工作的类似函数。