我问的是关于c#的问题,但我认为它在大多数其他语言中都是一样的。
有人对表达式和语句有很好的定义吗?它们的区别是什么?
我问的是关于c#的问题,但我认为它在大多数其他语言中都是一样的。
有人对表达式和语句有很好的定义吗?它们的区别是什么?
当前回答
为了改进和验证我之前的回答,编程语言术语的定义应该从计算机科学类型理论中解释。
表达式具有除Bottom类型以外的其他类型,即它有一个值。语句具有Unit或Bottom类型。
由此可见,语句只有在产生副作用时才能在程序中发挥作用,因为它要么不能返回值,要么只返回Unit类型的值,而Unit类型的值要么不可赋值(在某些语言中,如C的void),要么可以存储以用于语句的延迟求值。
显然,@pragma或/*comment*/没有类型,因此与语句有所区别。因此,唯一没有副作用的语句类型是非操作。非手术治疗只能作为未来副作用的占位符。由于声明而采取的任何其他行动都是副作用。同样,编译器提示,例如@pragma,不是语句,因为它没有类型。
其他回答
你可以在维基百科上找到这个,但是表达式被求值为某个值,而语句没有求值。
因此,表达式可以用在语句中,但不能用在语句中。
请注意,一些语言(如Lisp,我相信Ruby,以及许多其他语言)并不区分语句和表达式……在这样的语言中,所有东西都是一个表达式,并且可以与其他表达式连接。
表达式是产生一个值的任何东西:2 + 2 语句是程序执行的基本“块”之一。
注意,在C语言中,“=”实际上是一个运算符,它做两件事:
返回右边子表达式的值。 将右边子表达式的值复制到左边的变量中。
下面是一段ANSI C语法的摘录。你可以看到C语言没有很多不同种类的语句……程序中的大多数语句都是表达式语句,即结尾带有分号的表达式。
statement
: labeled_statement
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
;
expression_statement
: ';'
| expression ';'
;
http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
很简单:表达式的值是一个值,而语句不是。
表达式
一段可以求值的语法。换句话说,表达式是表达式元素的累积,如字面量、名称、属性访问、操作符或函数调用,它们都返回一个值。与许多其他语言相比,并不是所有的语言结构都是表达式。还有一些语句不能用作表达式,比如while。赋值也是语句,而不是表达式。
声明
语句是套件(代码“块”)的一部分。语句可以是表达式,也可以是带有关键字的几个结构之一,如if、while或for。
为了解释表达式和语句在可组合性(可链接性)方面的重要区别,我最喜欢的参考文献是John Backus的图灵奖论文《编程可以从冯·诺伊曼风格中解放出来吗?》
命令式语言(Fortran, C, Java,…)强调用语句来构造程序,并有表达式作为一种事后思考。函数式语言强调表达式。纯函数式语言具有如此强大的表达式,以至于可以完全消除语句。