表达式与语句
表达式与语句之间的区别在于,表达式会返回一个值,而语句不会返回值。
这两者之间的重要区别在于,你可以将表达式链接在一起,而语句不能链接。
当然,语句是可以链接的。{stmt1; stmt2; stmt3;} 是一个链式结构,同时也是一个语句本身。
foo.voidFunc(1);
是一个返回void值的表达式。而while
和if
是语句。
我对于语句不能链接这一点很好奇。像这样的代码 "if (x > 1) return;" 是否被认为是将两个语句链接在一起?
我认为return
被认为是一个子语句。
这里的return语句隐式地位于if语句的代码块中,因此它是if语句的一部分,而不是与if语句链接在一起的。编译器允许我们省略括号,因为它只有一行代码。
表达式与语句之间的区别是程序执行的基本“块”。C语言中的“=”实际上是一个运算符,它有两个作用:返回右边子表达式的值,并将右边子表达式的值复制到左边的变量中。C语言中的语句类型并不多,大部分语句都是表达式语句,即以分号结束的表达式。
以下是来自ANSI C语法的一部分。可以看到,在C语言中并没有很多不同类型的语句...程序中的大部分语句都是表达式语句,即在结尾处带有分号的表达式。
statement : labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement ; expression_statement : ';' | expression ';' ;
在这里可以看到,C语言的语法规则中包含了各种类型的语句,其中表达式语句是最常见的一种。表达式与语句之间的区别在于表达式具有返回值,而语句没有返回值。另外,表达式可以作为语句的一部分出现,但语句不能作为表达式的一部分出现。
关于语句是什么以及它的作用的逻辑错误。声明式程序也可以执行,但声明式程序没有语句。语句具有“副作用”,即它是命令式的。详见我的回答。
总结起来,表达式与语句之间的区别在于表达式有返回值,而语句没有返回值。C语言中的大部分语句都是表达式语句,即以分号结束的表达式。语句具有“副作用”,即它是命令式的。
表达式与语句之间的区别在早期的通用编程语言中非常清晰。在FORTRAN中,语句是执行的单位,是一种你要执行的事情。表达式本身不能做任何事情,必须将其赋值给一个变量。FORTRAN没有像今天我们所知的语法,语法和Backus-Naur Form(BNF)一起被发明,作为Algol-60定义的一部分。这时,“具有值”和“执行某些操作”之间的语义区别被固定在语法中,一种是表达式,另一种是语句,解析器可以区分它们。后来的语言设计者模糊了这种区别,他们允许语法表达式执行操作,并允许具有值的语法语句。最早的流行的语言例子是C。C的设计者意识到,如果允许评估一个表达式并丢弃结果,不会造成任何损害。在C中,通过在末尾添加分号,每个语法表达式都可以成为一条语句。类似地,在C中,表达式可以具有副作用,可以改变某些东西。一旦允许任何表达式成为语句,你也可以允许赋值运算符(=)在表达式中。这就是为什么C允许你做这样的事情。这模糊了表达式和语句在所有C衍生语言(C,C ++,C#和Java)中的区别,这些语言仍然有一些语句,但几乎允许任何表达式用作语句。具有两个“语法类别”(这是语句和表达式的技术名称)可能会导致工作的重复。例如,C有两种条件形式,语句形式和表达式形式。其他语言的设计者不喜欢这种重复,他们很早就意识到,如果表达式除了值还可以具有副作用,那么语句和表达式之间的语法区别并不是那么有用,所以他们取消了这种区别。Haskell,Icon,Lisp和ML都是不具有语法语句的语言,它们只有表达式。即使是类结构化的循环和条件形式也被视为表达式,它们有值,但不是非常有趣的值。