我问的是关于c#的问题,但我认为它在大多数其他语言中都是一样的。
有人对表达式和语句有很好的定义吗?它们的区别是什么?
我问的是关于c#的问题,但我认为它在大多数其他语言中都是一样的。
有人对表达式和语句有很好的定义吗?它们的区别是什么?
当前回答
表达式
一段可以求值的语法。换句话说,表达式是表达式元素的累积,如字面量、名称、属性访问、操作符或函数调用,它们都返回一个值。与许多其他语言相比,并不是所有的语言结构都是表达式。还有一些语句不能用作表达式,比如while。赋值也是语句,而不是表达式。
声明
语句是套件(代码“块”)的一部分。语句可以是表达式,也可以是带有关键字的几个结构之一,如if、while或for。
其他回答
表达式可以求值得到一个值,而语句不返回值(它们是void类型)。
当然,函数调用表达式也可以被视为语句,但除非执行环境有一个特殊的内置变量来保存返回值,否则无法检索它。
面向语句的语言要求所有过程都是语句列表。面向表达式的语言,可能是所有的函数式语言,都是表达式的列表,或者在LISP的情况下,是一个表示表达式列表的长s表达式。
尽管这两种类型都可以组合,但只要类型匹配,大多数表达式都可以任意组合。每种类型的语句都有自己的方式来组合其他语句,如果它们可以做到这一切的话。Foreach和if语句要么要求单个语句,要么要求所有子语句一个接一个地放入语句块中,除非子语句允许它们自己的子语句。
语句还可以包括表达式,而表达式实际上不包括任何语句。不过,lambda表达式是一个例外,它表示一个函数,因此可以包括函数可以包含的任何东西,除非语言只允许有限的lambdas,比如Python的单表达式lambdas。
在基于表达式的语言中,你所需要的只是一个函数的单个表达式,因为所有的控制结构都返回一个值(其中很多返回NIL)。不需要return语句,因为函数中最后求值的表达式就是返回值。
陈述句是语法上完整的句子。表达式则不然。例如
x = 5
读起来是“x得到5”。这是一个完整的句子。的代码
(x + 5)/9.0
结果是,x + 5都除以9.0这不是一个完整的句子。该声明
while k < 10:
print k
k += 1
是一个完整的句子。注意,循环头不是;"while k < 10 "是从句。
表达式是返回值的东西,而语句则不是。
例子:
1 + 2 * 4 * foo.bar() //Expression
foo.voidFunc(1); //Statement
两者之间的重要之处在于,您可以将表达式链接在一起,而语句则不能被链接。
在面向语句的编程语言中,代码块被定义为语句列表。换句话说,语句是可以放入代码块而不会导致语法错误的一段语法。
维基百科对statement这个词的定义类似
在计算机编程中,语句是命令式编程语言的语法单位,它表示要执行的某些操作。用这种语言编写的程序由一个或多个语句的序列组成
注意后一种说法。(尽管在这种情况下,“一个程序”在技术上是错误的,因为C和Java都拒绝一个不包含任何语句的程序。)
维基百科对表达式的定义是
编程语言中的表达式是一个语法实体,可以对其求值以确定其值
然而,这是错误的,因为在Kotlin中,throw new Exception("")是一个表达式,但当求值时,它只是抛出一个异常,从不返回任何值。
在静态类型编程语言中,每个表达式都有一个类型。然而,这个定义在动态类型编程语言中不起作用。
就我个人而言,我将表达式定义为一段语法,它可以由运算符或函数调用组成,以产生更大的表达式。这其实和维基百科对表达式的解释很相似:
它是一个或多个常量、变量、函数和操作符的组合,编程语言解释(根据其特定的优先级和关联规则)并计算产生(在有状态环境中为“返回”)另一个值
但是,问题是在C编程语言中,给定一个函数执行如下内容:
void executeSomething(void){
return;
}
executessomething()是表达式还是语句?根据我的定义,它是一个语句,因为根据微软C引用语法的定义,
不能以任何方式使用具有void类型的表达式的(不存在的)值,也不能将void表达式(通过隐式或显式转换)转换为除void以外的任何类型
但同一页明确指出,这样的语法是一个表达式。
语句->按顺序执行的指令 表达式->返回值的求值
语句基本上就像算法中的步骤或指令,语句执行的结果是指令指针的实现(所谓的汇编程序)。
表达式乍一看并不意味着和执行顺序,它们的目的是求值并返回值。在命令式编程语言中,表达式的求值是有顺序的,但这只是命令式模型的原因,而不是它们的本质。
语句示例:
for
goto
return
if
(所有这些都意味着执行的行(语句)提前到另一行)
表达式示例:
2+2
(这并不是指执行,而是指评估)