问题描述
我了解在前缀/后缀中,无需担心运算符的优先级。 但是我们在哪里使用前缀/后缀表达式? 它们是由编译器内部转换的吗? 有什么办法可以在前缀/后缀中编写表达式,然后编译器为我评估它?
1楼
编辑:如果您实际上是在谈论后缀(RPN)表示法,那么不,编译器对表达式使用中缀表示法。 您可以编写将RPN表达式转换为中缀表达式的算法,请尝试执行
后缀和前缀运算符就像二进制运算符一样,但是它们仅作用于一个操作数。
后缀增量(增量在变量求值后发生):
int x = 1;
int y = x++; // y = 1 but after the assignment occurs x = 2
int z = x; // z = 2
前缀增量:
int x = 1;
int y = ++x; // y = 2 and before the assignment occurs x = 2
int z = x; // z = 2
适用于增量运算符的规则也适用于减量运算符。
前缀NOT(反转布尔表达式):
boolean a = true;
boolean b = !a; // b = false, a = true
我想我已经正确理解了这个问题,但是我不确定您对编译器“为您评估”的含义。
2楼
很少有语言使用后缀表示法(我所知道的唯一一种是PostScript),但是最终的CPU指令与后缀表示法相同:
a = (3 + 4) * 5
要么
a = * + 3 4 5
将被转换(以一个虚构的,非常简单的指令集):
add r0 3 4 # r0 = 3 + 4
mul r1 r0 5 # r1 = r0 * 5
您的CPU不在乎初始符号,它只接受一套“基本”指令,因此编译器必须将您使用的符号转换为CPU可以理解的指令。
3楼
我怀疑前缀和后缀运算符和符号对于当今的理论最有用,但它们已被“实际使用”。 例如参见 , , 和