为了账号安全,请及时绑定邮箱和手机立即绑定

表达式与语句

表达式与语句

杨__羊羊 2019-07-11 13:13:12
表达式与语句我问的是c#,但在大多数其他语言中也是如此。有没有人能很好的定义表达和陈述有什么不同吗?
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

表达:计算值的值。例子:1+2/x
声明:做某事的代码行。例子:后藤100

在最早的通用编程语言(如FORTRAN)中,区别是非常清楚的.在FORTRAN中,语句是一个执行单位,是您所做的事情。它没有被称为“行”的唯一原因是因为它有时跨越多行。一个表情本身不能做任何事情.。你必须把它赋值给一个变量。

1 + 2 / X

是FORTRAN中的一个错误,因为它什么都不做。你必须用这句话做点什么:

X = 1 + 2 / X

Fortran没有我们今天所知道的语法-这个想法是和Backus-NaurForm(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都是没有语法语句的语言-它们只有表达式。即使是类结构化循环和条件形式也被认为是表达式,它们有值-但不是很有趣的值。


查看完整回答
反对 回复 2019-07-11
?
慕少森

TA贡献2019条经验 获得超9个赞

我想对乔尔上面的回答作一个小小的修正。

C#不允许将所有表达式用作语句。特别是,只有赋值、调用、增量和递减表达式可以用作语句。

例如,C#编译器将以下代码标记为语法错误:

1 + 2;


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 424 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信