我问的是关于c#的问题,但我认为它在大多数其他语言中都是一样的。

有人对表达式和语句有很好的定义吗?它们的区别是什么?


当前回答

最准确地说,语句必须有“副作用”(即命令式),表达式必须有值类型(即不是底部类型)。

语句的类型是单元类型,但由于停止定理,单元是虚构的,所以我们说底层类型。


Void并不是最下面的类型(它不是所有可能类型的子类型)。它存在于没有完整的声音类型系统的语言中。这听起来可能有点势利,但是完整性(如方差注释)对于编写可扩展软件是至关重要的。

让我们看看维基百科对这件事是怎么说的。

https://en.wikipedia.org/wiki/Statement_ (computer_science)

在计算机编程中,语句是命令式编程语言中最小的独立元素,它表示要执行的某些操作。 许多语言(例如C语言)区分语句和定义,语句只包含可执行代码和声明标识符的定义,而表达式只计算值。

其他回答

表达式:求值为某个值的东西。例如:1 + 2 / x 语句:执行某些操作的代码行。例如:GOTO 100

在最早的通用编程语言(如FORTRAN)中,这种区别是非常明显的。在FORTRAN中,一条语句是一个执行单元,是你所做的一件事。它不被称为“线”的唯一原因是因为有时它跨越多条线。一个表达式本身什么都做不了……你必须把它赋值给一个变量。

1 + 2 / X

是FORTRAN中的一个错误,因为它不做任何事情。你必须对这个表达做些什么:

X = 1 + 2 / X

FORTRAN没有我们今天所知道的语法——这个想法和巴克斯-诺尔表单(BNF)一起被发明出来,作为algolo -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#中,只有赋值、调用、自增和自减表达式可以用作语句;参见Scott Wisniewski的回答)。

拥有两个“语法类别”(这是语句和表达式这类东西的专业名称)可能会导致重复工作。例如,C语言中有两种形式的条件句,一种是语句形式

if (E) S1; else S2;

以及表达式形式

E ? E1 : E2

有时人们希望复制不存在的内容:例如,在标准C中,只有语句可以声明一个新的局部变量——但是这种能力非常有用,可以使用 GNU C编译器提供了一个GNU扩展,允许表达式声明局部变量。

Designers of other languages didn't like this kind of duplication, and they saw early on that if expressions can have side effects as well as values, then the syntactic distinction between statements and expressions is not all that useful—so they got rid of it. Haskell, Icon, Lisp, and ML are all languages that don't have syntactic statements—they only have expressions. Even the class structured looping and conditional forms are considered expressions, and they have values—but not very interesting ones.

语句是一段不返回任何东西的代码,它只是一个独立的执行单元。例如,

if(a>=0)
printf("Hello Humen,I'm a statement");

另一方面,表达式返回或计算一个新值。例如:

 if(a>=0)
    return a+10;//This is an expression because it evalutes an new value;

or

 a=10+y;//This is also an expression because it returns a new value. 

语句->按顺序执行的指令 表达式->返回值的求值

语句基本上就像算法中的步骤或指令,语句执行的结果是指令指针的实现(所谓的汇编程序)。

表达式乍一看并不意味着和执行顺序,它们的目的是求值并返回值。在命令式编程语言中,表达式的求值是有顺序的,但这只是命令式模型的原因,而不是它们的本质。

语句示例:

for
goto
return
if

(所有这些都意味着执行的行(语句)提前到另一行)

表达式示例:

2+2

(这并不是指执行,而是指评估)

陈述句是语法上完整的句子。表达式则不然。例如

x = 5

读起来是“x得到5”。这是一个完整的句子。的代码

(x + 5)/9.0

结果是,x + 5都除以9.0这不是一个完整的句子。该声明

while k < 10: 
    print k
    k += 1

是一个完整的句子。注意,循环头不是;"while k < 10 "是从句。

声明中,

语句是构造所有c#程序的过程构建块。语句可以声明局部变量或常量,调用方法,创建对象,或为变量、属性或字段赋值。

由花括号括起来的一系列语句构成了一个代码块。方法体就是代码块的一个例子。

bool IsPositive(int number)
{
    if (number > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

c#中的语句通常包含表达式。c#中的表达式是包含文字值、简单名称或操作符及其操作数的代码片段。

表达式,

表达式是可以计算为单个值、对象、方法或名称空间的代码片段。最简单的两种表达式是字面量和简单名称。字面量是一个没有名字的常量值。

int i = 5;
string s = "Hello World";

i和s都是用来标识局部变量的简单名称。当在表达式中使用这些变量时,将检索变量的值并将其用于表达式。