Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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_Expression_Postfix Notation - Fatal编程技术网

什么类型的算法用于C#表达式?

什么类型的算法用于C#表达式?,c#,compiler-construction,expression,postfix-notation,C#,Compiler Construction,Expression,Postfix Notation,用于将表达式从中缀转换为后缀表示法(反向波兰表示法),以便编译器对其求值。例如,2+3*2将转换为2*+。在中,提到该算法被许多应用程序使用,包括 任何面向堆栈的编程语言,例如: 向前地 因素 PostScript页面描述语言, Befunge, 喜乐 我看不到C#或任何流行的高级语言。那么,C#对表达式使用这种算法吗?如果否,C#编译器如何编译和计算表达式?是的,C#被转换为面向堆栈的编程语言--。当编译器将表达式转换为内部语言时,它会列出RPN后面的操作列表 例如,这个方法 int x(in

用于将表达式从中缀转换为后缀表示法(反向波兰表示法),以便编译器对其求值。例如,
2+3*2
将转换为
2*+
。在中,提到该算法被许多应用程序使用,包括

任何面向堆栈的编程语言,例如: 向前地 因素 PostScript页面描述语言, Befunge, 喜乐

我看不到C#或任何流行的高级语言。那么,C#对表达式使用这种算法吗?如果否,C#编译器如何编译和计算表达式?

是的,C#被转换为面向堆栈的编程语言--。当编译器将表达式转换为内部语言时,它会列出RPN后面的操作列表

例如,这个方法

int x(int a, int b, int c, int d) {
    return a+b*(c+d);
}
转换为此内部语言(请参阅注释以了解发生的情况):

正如您所看到的,操作数被推到堆栈上的顺序使得从表达式的后面到它的前面执行操作非常方便——这正是本文所解释的方式


转换的精确算法取决于编译器(严格地说,最终结果也取决于编译器,因为有多种方法可以将表达式转换为有效的RPN序列),但RPN的基本思想就在那里。

您的维基百科引用并没有提到语言在内部表示程序的方式,它只是在谈论使用反向波兰语作为程序员编写程序的方式的语言。你的问题不是很有意义。那也不是一个有意义的问题。每个编译器的工作方式都不同。这有什么关系?你想解决什么问题取决于C#编译器的内部设计?我只是想知道(出于好奇)将
(a+b)*C
转换为公共中间语言所使用的算法是什么。那么它如何知道(a+b)必须首先计算呢?编译器是否使用调车场算法?或者将表达式表示为一棵树?至少有4个C#编译器,请参见@Barmar。所有有关的问题都必须关注构造问题的细节吗?虽然它的范围可能有点广,但从这个问题中可以学到很多东西。突然间,我一直在研究的一个问题,与我在这里看到的东西只有很遥远的联系,突然出现在3d中。一个不相关的+1!
IL_0001:  ldarg.0 // Push a on the stack
IL_0002:  ldarg.1 // Push b on the stack
IL_0003:  ldarg.2 // Push c on the stack
IL_0004:  ldarg.3 // Push d on the stack
IL_0005:  add     // Add d+c, push the result
IL_0006:  mul     // Multiply (d+c) by b
IL_0007:  add     // Add b*(d+c)+a