在一些动态语言中,我见过这样的语法:
myValue = if (this.IsValidObject)
{
UpdateGraph();
UpdateCount();
this.Name;
}
else
{
Debug.Log (Exceptions.UninitializedObject);
3;
}基本上能够返回分支中的最后一条语句作为变量的返回值,不一定只是方法返回,但它们也可以实现。
这个功能的名称是什么?
这也可以在静态类型的语言中实现吗,比如C#?我知道C#有三元运算符,但我的意思是使用如上所示的if语句和switch语句。
发布于 2011-03-23 06:17:53
它被称为“条件分支是表达式”或“语句/表达式划分的死亡”。
请参阅Conditional If Expressions
许多语言都支持if表达式,它类似于if语句,但返回一个值作为结果。因此,它们是真的表达式(计算结果为一个值),而不是语句(只执行一个操作)。
也就是说,if (expr) { ... }是语言语法中的表达式(可以是表达式或语句,取决于上下文),就像?:是C、C#或Java等语言中的表达式一样。
这种形式在函数式编程语言中很常见(避免了副作用) --然而,它本身并不是“函数式编程”,而是存在于接受/允许“类似函数式语法”的其他语言中,同时仍然使用严重的副作用和其他范例(例如Ruby)。
一些语言,如Perl,允许模拟这种行为。也就是说,$x = eval { if (true) { "hello world!" } else { "goodbye" } }; print $x将显示"hello world!“因为eval表达式的计算结果是内部计算的最后一个值,即使if语法结果本身不是一个表达式。($x = if ...在Perl中是一个语法错误)。
祝你编码愉快。
发布于 2011-03-23 06:18:25
它是一个三元条件。
在C中,你可以使用,例如:
printf("Debug? %s\n", debug?"yes":"no");编辑:
复合语句列表可以在C中作为表达式求值。最后一条语句应该是一个表达式,并且整个复合语句都要用大括号括起来。
例如:
#include <stdio.h>
int main(void)
{
int a=0, b=1;
a=({
printf("testing compound statement\n");
if(b==a)
printf("equals\n");
b+1;
});
printf("a=%d\n", a);
return 0;
}因此,您正在执行的特征的名称是将复合语句赋值给(本地)变量。现在我认为这对你有更多的帮助。如需更多信息,请访问以下网址:http://www.chemie.fu-berlin.de/chemnet/use/info/gcc/gcc_8.html
保重,贝科。
PS。这个例子在你的问题的上下文中更有意义:
a=({
int c;
if(b==a)
c=b+1;
else
c=a-1;
c;
});发布于 2011-03-23 06:55:21
回答你的另一个问题:
在诸如C#这样的静态类型语言中也可以实现吗?
这是一种语言支持的东西吗?不是的。它能实现吗?有点。
C# --像C++、Java以及其他诸如此类的东西--有表达式和语句。if-then和switch-case等语句不返回值,因此不能用作表达式。另外,顺便提一下,您的示例将myValue赋值给字符串或整数,这是C#不能做的,因为它是强类型的。您要么使用object myValue,然后接受转换和装箱成本,要么使用var myValue (它仍然是静态类型的,只是推断出来的),或者其他一些奇怪的聪明方法。
无论如何,如果if-then是一条语句,那么如何在C#中做到这一点呢?您必须构建一个方法来实现if-then-else的目标。您可以使用静态方法作为bools的扩展,以Smalltalk的方式进行建模:
公共静态T值(此布尔值,操作doThen,操作doElse ){if(IfTrue)doThen doThen();else return doElse();}
要使用它,您应该这样做:
var myVal = (6 < 7).IfTrue(() => return "Less than", () => return "Greater than");新的IfTrue()函数检查它所附加的布尔值,并执行传递给它的两个委托中的一个。它们必须具有相同的返回类型,并且都不接受参数(使用闭包,所以这无关紧要)。
现在,你应该这样做吗?不,几乎可以肯定不是。这不是正确的C#方式,所以它令人困惑,而且它的效率比使用if-then低得多。您正在用一条IL指令来换取一堆复杂的类和方法调用,.NET将在幕后构建这些类和方法调用来支持这一点。
https://stackoverflow.com/questions/5398484
复制相似问题