我已经编写了一个简单的基于堆栈的虚拟机,当我使用 clang 编译它时,您可以在https://github.com/radinParsaei/VM查看它的源代码,但如果它使用 GCC 以字节码编译,我已经像pop() / pop()
它一样工作不规则它返回stack[stack.size() - 2] / stack[stack.size() - 1]
我通过编写代码来解决这个问题,就像Value a = pop(); Value b = pop(); return a / b;
任何人都有更好的想法一样?
问问题
53 次
1 回答
2
正如@IlCapitano 所说,您的第二个pop()
可能会被首先调用:
C++ 中没有从左到右或从右到左求值的概念。不要将这与运算符的从左到右和从右到左的结合性相混淆:表达式 a() + b() + c() 被解析为 (a() + b()) + c( ) 由于 operator+ 的从左到右的关联性,但对 c 的函数调用可以在运行时首先、最后或在 a() 或 b() 之间进行评估
关键: 对 c 的函数调用可以在运行时首先、最后或在 a() 或 b() 之间进行评估。
回应评论:
评估顺序未指定(有一些例外)。编译器可以按任何顺序计算操作数和其他子表达式,并且可以在再次计算同一表达式时选择另一个顺序。
所以这取决于编译器。每个人的做法都不一样。
于 2020-07-12T18:23:13.873 回答