Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果您被迫简化C#循环关键字,请只选择一个要保留的关键字_C#_Compiler Construction_Programming Languages_Language Design_Lexical Analysis - Fatal编程技术网

如果您被迫简化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 ,您只需要而就可以表达所有其他内容(甚至是条件语句),所以我会保留它。如果你要发明真正的最小命令式编程语言

如果您被迫简化可用于循环的C#关键字,请只选择一个要保留的关键字

  • 为了
  • 暂且
  • 转到标签如果
  • 弗雷奇
关于您的决定,是否有任何绩效考量


其实我不知道他们的内部机制,所以我想在这里采访你们这些知道细节的人。然而,有人已经关闭了它。真伤心

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-因为它绝对是最强大的一个。。。