我问的是c#,但我认为在大多数其他语言中也是如此。
有没有人对表达和陈述有一个很好的定义,区别是什么?
发布于 2008-08-21 02:17:21
表达式:计算值为值的。示例: 1+2/x
语句:执行某项任务的代码行。示例: GOTO 100
在最早的通用编程语言(如FORTRAN )中,区别是非常清楚的.在FORTRAN中,语句是一个执行单位,是您所做的事情。它没有被称为“行”的唯一原因是因为它有时跨越多行。一个表情本身不能做任何事情..。你必须把它赋值给一个变量。
1 + 2 / X是FORTRAN中的一个错误,因为它什么都不做。你必须用这句话做点什么:
X = 1 + 2 / XFORTRAN没有我们今天所知道的语法--这个想法是和Backus (BNF)一起发明的,作为Algol-60定义的一部分。在这一点上,语义上的区别(“有值”和“做某事”)被写入语法:一种短语是表达式,另一种是语句,解析器可以将它们区分开来。
后来语言的设计者模糊了两者之间的区别:他们允许句法表达式去做事情,他们允许有价值的句法语句。现存最早的流行语言例子是C。C的设计者意识到,如果允许对表达式进行评估并丢弃结果,就不会造成任何伤害。在C中,每一个句法表达式都可以通过在结尾加上分号来生成语句:
1 + 2 / x;这是一个完全合法的声明,尽管绝对不会发生任何事情。类似地,在C中,表达式可能有副作用--它可以改变一些东西。
1 + 2 / callfunc(12);因为callfunc可能只是做一些有用的事情。
一旦允许任何表达式成为语句,则最好允许表达式中的赋值运算符(=)。这就是为什么C允许你做这样的事情
callfunc(x = 2);这将计算表达式x=2(将值2赋值为x),然后将该表达式( 2)传递给函数callfunc。
表达式和语句的模糊出现在所有C-派生类(C、C++、C#和Java)中,它们仍然有一些语句(如while),但允许几乎任何表达式作为语句使用(在C#专用赋值、调用、增量和递减表达式中,可以使用它们作为语句;参见斯科特·维斯涅夫斯基的回答)。
有两个“句法类别”(这是语句和表达式的类型的技术名称)可能会导致重复工作。例如,C有两种形式的条件,语句形式
if (E) S1; else S2;以及表达形式
E ? E1 : E2有时候,人们想要的是不存在的复制:例如,在标准C中,只有一条语句可以声明一个新的局部变量--但是这种能力非常有用,以至于GNU C编译器提供了一个GNU扩展,它使表达式也能够声明局部变量。
其他语言的设计者不喜欢这种重复,他们很早就看到如果表达式有副作用和值,那么语句和表达式之间的句法区别就没有那么有用了,所以他们就把它去掉了。Haskell、Icon、Lisp和ML都是没有语法语句的语言--它们只有表达式。即使是类的结构化循环和条件形式也被认为是表达式,它们有值--但不是很有趣的值。
发布于 2008-08-21 05:05:58
注意,在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
发布于 2008-08-21 00:30:44
表达式是返回值的东西,而语句不返回值。
例如:
1 + 2 * 4 * foo.bar() //Expression
foo.voidFunc(1); //Statement两者之间的主要问题是,您可以将表达式链接在一起,而语句不能被链接。
https://stackoverflow.com/questions/19132
复制相似问题