首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表达式与语句

表达式与语句
EN

Stack Overflow用户
提问于 2008-08-21 00:28:00
回答 20查看 76.8K关注 0票数 464

我问的是c#,但我认为在大多数其他语言中也是如此。

有没有人对表达和陈述有一个很好的定义,区别是什么?

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2008-08-21 02:17:21

表达式:计算值为值的。示例: 1+2/x

语句:执行某项任务的代码行。示例: GOTO 100

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

代码语言:javascript
运行
复制
1 + 2 / X

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

代码语言:javascript
运行
复制
X = 1 + 2 / X

FORTRAN没有我们今天所知道的语法--这个想法是和Backus (BNF)一起发明的,作为Algol-60定义的一部分。在这一点上,语义上的区别(“有值”和“做某事”)被写入语法:一种短语是表达式,另一种是语句,解析器可以将它们区分开来。

后来语言的设计者模糊了两者之间的区别:他们允许句法表达式去做事情,他们允许有价值的句法语句。现存最早的流行语言例子是C。C的设计者意识到,如果允许对表达式进行评估并丢弃结果,就不会造成任何伤害。在C中,每一个句法表达式都可以通过在结尾加上分号来生成语句:

代码语言:javascript
运行
复制
1 + 2 / x;

这是一个完全合法的声明,尽管绝对不会发生任何事情。类似地,在C中,表达式可能有副作用--它可以改变一些东西。

代码语言:javascript
运行
复制
1 + 2 / callfunc(12);

因为callfunc可能只是做一些有用的事情。

一旦允许任何表达式成为语句,则最好允许表达式中的赋值运算符(=)。这就是为什么C允许你做这样的事情

代码语言:javascript
运行
复制
callfunc(x = 2);

这将计算表达式x=2(将值2赋值为x),然后将该表达式( 2)传递给函数callfunc

表达式和语句的模糊出现在所有C-派生类(C、C++、C#和Java)中,它们仍然有一些语句(如while),但允许几乎任何表达式作为语句使用(在C#专用赋值、调用、增量和递减表达式中,可以使用它们作为语句;参见斯科特·维斯涅夫斯基的回答)。

有两个“句法类别”(这是语句和表达式的类型的技术名称)可能会导致重复工作。例如,C有两种形式的条件,语句形式

代码语言:javascript
运行
复制
if (E) S1; else S2;

以及表达形式

代码语言:javascript
运行
复制
E ? E1 : E2

有时候,人们想要的是不存在的复制:例如,在标准C中,只有一条语句可以声明一个新的局部变量--但是这种能力非常有用,以至于GNU C编译器提供了一个GNU扩展,它使表达式也能够声明局部变量。

其他语言的设计者不喜欢这种重复,他们很早就看到如果表达式有副作用和值,那么语句和表达式之间的句法区别就没有那么有用了,所以他们就把它去掉了。Haskell、Icon、Lisp和ML都是没有语法语句的语言--它们只有表达式。即使是类的结构化循环和条件形式也被认为是表达式,它们有值--但不是很有趣的值。

票数 560
EN

Stack Overflow用户

发布于 2008-08-21 05:05:58

  • 表达式是产生值的任何东西:2+2
  • 语句是程序执行的基本“块”之一。

注意,在C中,"=“实际上是一个操作符,它做两件事:

  • 返回右手子表达式的值。
  • 将右手子表达式的值复制到左侧的变量中。

这是ANSI C语法的摘录。你可以看到C没有很多不同的语句..。程序中的大多数语句都是表达式语句,即末尾带有分号的表达式。

代码语言:javascript
运行
复制
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

票数 24
EN

Stack Overflow用户

发布于 2008-08-21 00:30:44

表达式是返回值的东西,而语句不返回值。

例如:

代码语言:javascript
运行
复制
1 + 2 * 4 * foo.bar()     //Expression
foo.voidFunc(1);          //Statement

两者之间的主要问题是,您可以将表达式链接在一起,而语句不能被链接。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档