在您选择的三种语言标记中,我只熟悉Python,但我相信许多其他语言对这些概念有类似的看法。这里所有的示例代码都是Python。
语句是执行的东西;是语言实现理解的“做某事的指令”。e、 gprint "Hello World"
pass
def foo(n):
return n + 1
if condition:
print 'yay'
else:
print 'doh'
上面的块包含print语句、pass语句、函数定义语句和if/else语句。注意,函数定义和if/else语句是复合语句;它们包含其他语句(可能有许多语句,也可能有其他复合语句)。
表达式是可以计算以产生值的值。e、 g1
"foo"
2 * 6
function(argument)
None
上面包含数字文本表达式、字符串文本表达式、包含数字运算符的表达式、函数调用表达式和文本无表达式。除了文字和变量,表达式由其他表达式组成。在function(argument)中,function和argument也是这两个表达式。
关键的区别在于,语句是指示语言实现“去做某事”的指令。表达式被计算为一个值(这可能需要语言实现在路上“做点什么”)。
这样做的一个结果是,无论你在哪里看到一个值(包括一个表达式),你都可以替换任何其他表达式,你仍然可以得到一些有意义的东西。它可能无法编译,或者在运行时抛出异常,或者其他什么,但至少在某种程度上,您可以理解发生了什么。
语句永远不会出现在表达式中(我相信这在Ruby和Javascript中是不正确的,因为它们允许文本代码块和函数作为一个整体使用,而函数和代码块包含语句;但这与我所说的有点不同)。表达式必须有一个值(即使是像None这样的无趣表达式)。语句是命令;它作为表达式的一部分出现是没有意义的,因为它没有值。
许多语言也允许将表达式用作语句。通常的意思是“对这个表达式求值以得到一个值,然后扔掉它”。在Python中,总是返回None的函数通常是这样使用的:write_to_disk(result)
它被用作一个“命令”,所以它看起来像一个语句,但从技术上讲它是一个表达式,我们只是不使用它的值来计算任何东西。你可以说“裸表达式”是一种语言中可能的语句之一(它们通常是这样解析的)。
但是,有些语言区分了必须像没有返回值的语句一样使用的函数(通常称为过程)和像表达式一样使用的函数,并为使用像语句一样的函数提供了错误或警告,并且肯定为使用过程作为表达式提供了错误。
所以,如果foo是一个表达式,我可以编写1 + foo,虽然它可能会导致类型错误,但它至少有这么大的意义。如果foo是一个语句,那么1 + foo通常是一个解析错误;语言实现甚至无法理解您要说的内容。
另一方面,函数是可以调用的。它本身并不是一个表达式或语句。在Python中,使用def语句创建函数,函数调用是表达式。创建函数后绑定到该函数的名称也是表达式。但函数本身是一个值,这在技术上并不是一个表达式,但肯定不是一个语句。
所以,对于循环。这是Python中的for循环:for thing in collection:
do_stuff(thing)
看起来像一个语句(复合语句tement,就像if语句)。为了证明这一点,这完全没有意义(而且是一个解析错误):1 + for thing in collection:
do_stuff(thing)
不过,在某些语言中,for循环的等价物是表达式,并且有一个值,可以尝试向该值添加1。在某些情况下,它甚至是一个函数,而不是语言中的特殊语法。