我问的是关于c#的问题,但我认为它在大多数其他语言中都是一样的。
有人对表达式和语句有很好的定义吗?它们的区别是什么?
我问的是关于c#的问题,但我认为它在大多数其他语言中都是一样的。
有人对表达式和语句有很好的定义吗?它们的区别是什么?
当前回答
关于基于表达式的语言的一些事情:
最重要的是:所有内容都返回一个值
用于分隔代码块和表达式的花括号和大括号之间没有区别,因为所有内容都是表达式。不过,这并不会阻止词法作用域:例如,可以为包含其定义的表达式和该表达式中包含的所有语句定义局部变量。
在基于表达式的语言中,所有内容都返回一个值。这一开始可能有点奇怪——(FOR i = 1 TO 10 DO (print i))返回什么?
一些简单的例子:
(1)返回1 (1 + 1)返回2 (1 == 1)返回TRUE (1 == 2)返回FALSE (IF 1 == 1 THEN 10 ELSE 5)返回10 (IF 1 == 2 THEN 10 ELSE 5)返回5
还有一些更复杂的例子:
Some things, such as some function calls, don't really have a meaningful value to return (Things that only produce side effects?). Calling OpenADoor(), FlushTheToilet() or TwiddleYourThumbs() will return some sort of mundane value, such as OK, Done, or Success. When multiple unlinked expressions are evaluated within one larger expression, the value of the last thing evaluated in the large expression becomes the value of the large expression. To take the example of (FOR i = 1 TO 10 DO (print i)), the value of the for loop is "10", it causes the (print i) expression to be evaluated 10 times, each time returning i as a string. The final time through returns 10, our final answer
通常需要稍微改变一下心态,才能最大限度地利用基于表达式的语言,因为所有东西都是表达式,这使得“内联”很多东西成为可能
举个简单的例子:
FOR i = 1 to (IF MyString == "Hello, World!"然后就有10个人这样做了 ( LotsOfCode )
非基于表达式的替换是否完全有效
IF MyString == "Hello, World!"THEN TempVar = 10 ELSE TempVar = 5 FOR i = 1 TO TempVar DO ( LotsOfCode )
在某些情况下,基于表达式的代码所允许的布局对我来说感觉更自然
当然,这可能导致疯狂。作为基于表达式的脚本语言MaxScript的爱好项目的一部分,我设法想出了这个怪物行
IF FindSectionStart "rigidifiers" != 0 THEN FOR i = 1 TO (local rigidifier_array = (FOR i = (local NodeStart = FindsectionStart "rigidifiers" + 1) TO (FindSectionEnd(NodeStart) - 1) collect full_array[i])).count DO
(
LotsOfCode
)
其他回答
表达式
一段可以求值的语法。换句话说,表达式是表达式元素的累积,如字面量、名称、属性访问、操作符或函数调用,它们都返回一个值。与许多其他语言相比,并不是所有的语言结构都是表达式。还有一些语句不能用作表达式,比如while。赋值也是语句,而不是表达式。
声明
语句是套件(代码“块”)的一部分。语句可以是表达式,也可以是带有关键字的几个结构之一,如if、while或for。
表达式是返回值的东西,而语句则不是。
例子:
1 + 2 * 4 * foo.bar() //Expression
foo.voidFunc(1); //Statement
两者之间的重要之处在于,您可以将表达式链接在一起,而语句则不能被链接。
为了改进和验证我之前的回答,编程语言术语的定义应该从计算机科学类型理论中解释。
表达式具有除Bottom类型以外的其他类型,即它有一个值。语句具有Unit或Bottom类型。
由此可见,语句只有在产生副作用时才能在程序中发挥作用,因为它要么不能返回值,要么只返回Unit类型的值,而Unit类型的值要么不可赋值(在某些语言中,如C的void),要么可以存储以用于语句的延迟求值。
显然,@pragma或/*comment*/没有类型,因此与语句有所区别。因此,唯一没有副作用的语句类型是非操作。非手术治疗只能作为未来副作用的占位符。由于声明而采取的任何其他行动都是副作用。同样,编译器提示,例如@pragma,不是语句,因为它没有类型。
语句是一段不返回任何东西的代码,它只是一个独立的执行单元。例如,
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 i = 1 TO 10 DO (print i))返回什么?
一些简单的例子:
(1)返回1 (1 + 1)返回2 (1 == 1)返回TRUE (1 == 2)返回FALSE (IF 1 == 1 THEN 10 ELSE 5)返回10 (IF 1 == 2 THEN 10 ELSE 5)返回5
还有一些更复杂的例子:
Some things, such as some function calls, don't really have a meaningful value to return (Things that only produce side effects?). Calling OpenADoor(), FlushTheToilet() or TwiddleYourThumbs() will return some sort of mundane value, such as OK, Done, or Success. When multiple unlinked expressions are evaluated within one larger expression, the value of the last thing evaluated in the large expression becomes the value of the large expression. To take the example of (FOR i = 1 TO 10 DO (print i)), the value of the for loop is "10", it causes the (print i) expression to be evaluated 10 times, each time returning i as a string. The final time through returns 10, our final answer
通常需要稍微改变一下心态,才能最大限度地利用基于表达式的语言,因为所有东西都是表达式,这使得“内联”很多东西成为可能
举个简单的例子:
FOR i = 1 to (IF MyString == "Hello, World!"然后就有10个人这样做了 ( LotsOfCode )
非基于表达式的替换是否完全有效
IF MyString == "Hello, World!"THEN TempVar = 10 ELSE TempVar = 5 FOR i = 1 TO TempVar DO ( LotsOfCode )
在某些情况下,基于表达式的代码所允许的布局对我来说感觉更自然
当然,这可能导致疯狂。作为基于表达式的脚本语言MaxScript的爱好项目的一部分,我设法想出了这个怪物行
IF FindSectionStart "rigidifiers" != 0 THEN FOR i = 1 TO (local rigidifier_array = (FOR i = (local NodeStart = FindsectionStart "rigidifiers" + 1) TO (FindSectionEnd(NodeStart) - 1) collect full_array[i])).count DO
(
LotsOfCode
)