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

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


当前回答

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

x = 5

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

(x + 5)/9.0

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

while k < 10: 
    print k
    k += 1

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

其他回答

很简单:表达式的值是一个值,而语句不是。

为了解释表达式和语句在可组合性(可链接性)方面的重要区别,我最喜欢的参考文献是John Backus的图灵奖论文《编程可以从冯·诺伊曼风格中解放出来吗?》

命令式语言(Fortran, C, Java,…)强调用语句来构造程序,并有表达式作为一种事后思考。函数式语言强调表达式。纯函数式语言具有如此强大的表达式,以至于可以完全消除语句。

语句是表达式的一种特殊情况,具有void类型。语言区别对待语句的倾向经常会导致问题,如果恰当地概括它们会更好。

例如,在c#中,我们有非常有用的Func<T1, T2, T3, TResult>重载泛型委托集。但是我们也必须有相应的Action<T1, T2, T3>集合,并且通用的高阶编程必须不断重复来处理这种不幸的分叉。

简单的例子——在调用另一个函数之前检查引用是否为空的函数:

TResult IfNotNull<TValue, TResult>(TValue value, Func<TValue, TResult> func)
                  where TValue : class
{
    return (value == null) ? default(TValue) : func(value);
}

编译器能处理TResult为空的可能性吗?是的。它所要做的就是要求return后面跟着一个void类型的表达式。default(void)的结果将是void类型,传递的func将需要是func <TValue, void>(这将等效于Action<TValue>)的形式。

其他一些答案暗示你不能像连接表达式那样连接语句,但我不确定这个想法是从哪里来的。我们可以想到;它作为二进制中缀运算符出现在语句之后,取void类型的两个表达式并将它们组合成一个void类型的表达式。

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

例子:

1 + 2 * 4 * foo.bar()     //Expression
foo.voidFunc(1);          //Statement

两者之间的重要之处在于,您可以将表达式链接在一起,而语句则不能被链接。

表达式是产生一个值的任何东西: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