如果您被迫简化C#循环关键字,请只选择一个要保留的关键字
如果您被迫简化可用于循环的C#关键字,请只选择一个要保留的关键字如果您被迫简化C#循环关键字,请只选择一个要保留的关键字,c#,compiler-construction,programming-languages,language-design,lexical-analysis,C#,Compiler Construction,Programming Languages,Language Design,Lexical Analysis,如果您被迫简化可用于循环的C#关键字,请只选择一个要保留的关键字 为了 暂且 当 转到标签如果 弗雷奇 关于您的决定,是否有任何绩效考量 其实我不知道他们的内部机制,所以我想在这里采访你们这些知道细节的人。然而,有人已经关闭了它。真伤心 While。其他一切都可以在while循环中模拟 我会很难过,因为我喜欢我的for循环:-(如果实际上没有循环,就转到标签。而且你错过了foreach ,您只需要而就可以表达所有其他内容(甚至是条件语句),所以我会保留它。如果你要发明真正的最小命令式编程语言
- 为了
- 暂且
- 当
- 转到标签如果
- 弗雷奇
其实我不知道他们的内部机制,所以我想在这里采访你们这些知道细节的人。然而,有人已经关闭了它。真伤心 While。其他一切都可以在while循环中模拟
我会很难过,因为我喜欢我的for循环:-(
如果
实际上没有循环,就转到标签。而且你错过了foreach
,您只需要
而就可以表达所有其他内容(甚至是条件语句),所以我会保留它。如果你要发明真正的最小命令式编程语言,子例程调用和while
循环就足够了。我会保留转到标签If
。这就是编译器将所有内容转换成的内容。流控制的最基本形式是条件分支,这是通过b完成的牧场
/跳转
操作码
我有一些循环转换的例子
…此C代码…
static void @ifgoto(bool input)
{
label:
if (input)
goto label;
}
static void @while(bool input)
{
while (input) ;
}
static void @for(bool input)
{
for (; input; ) ;
}
// load input
L_0000: ldarg.0
// if input is true branch to L_000
L_0001: brtrue.s L_0000
// else return
L_0003: ret
…编译成这个…
.method private hidebysig static void ifgoto(bool input) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: brtrue.s L_0000
L_0003: ret
}
.method private hidebysig static void while(bool input) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: brtrue.s L_0000
L_0003: ret
}
.method private hidebysig static void for(bool input) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: brtrue.s L_0000
L_0003: ret
}
。要进一步解释…
static void @ifgoto(bool input)
{
label:
if (input)
goto label;
}
static void @while(bool input)
{
while (input) ;
}
static void @for(bool input)
{
for (; input; ) ;
}
// load input
L_0000: ldarg.0
// if input is true branch to L_000
L_0001: brtrue.s L_0000
// else return
L_0003: ret
我会把留给循环-你可以省略这个循环的某些部分,然后模拟其他循环。同时,如果你使用所有部分,你会得到更强大的循环。我会完全保留goto-label-if。为什么这不是社区维基?谁还需要循环?我们有LINQ!@Markus Johnsson。你面对objec的情况如何不是IEnumerable或其变体的ts?这个问题的目的是什么?这是一个面试问题、语言设计问题等吗?谢谢。我将编辑并添加foreach。您可能不想听这个,但他们谈论的是跳转而不是循环。@Matthew抱歉?跳转需要goto
,这使得使用它的程序不太结构化d、 计算机更改流量控制的唯一方法是使用跳转
。如果查看CPU上的操作码列表,则在操作码时不会找到。如果您注意到它们指的是标签
目标。这些是跳转
的目标。所有跳转要么是如果
或者转到
。您可以也可以使用你真正想要的“if/recursion”。这就是尾部调用/模式匹配在F#中的工作方式。谢谢你…介意评论一下你为什么不同意吗?+1-因为它绝对是最强大的一个。。。