后缀否定是不正确的,而且是交流性的
Postfix negative is incorrect and communative
所以我使用堆栈来评估Postfix
表达式。表达式10 6 -
读作10 - 6
中缀并且应该等于4
。但事实并非如此,它等于-4
。更糟糕的是,即使我试图反转代码,它仍然等于-4
。我不确定这是否是我的堆栈、函数调用或C++的一些怪癖出了问题。然而,如果我将堆栈中的1个弹出值存储在一个变量中,然后执行等式,它会很好地工作。
相关代码:堆栈类
template <class Item>
class stack {
private:
struct node {
Item item;
node* next;
node(Item x, node* t) {
item = x;
next = t;
}
};
typedef node* link;
link head;
public:
stack(int) { head = 0; }
int empty() const { return head == 0; }
void push(Item x) { head = new node(x, head); }
Item pop() {
Item v = head->item;
link t = head->next;
delete head;
head = t;
return v;
}
};
Evalutating the negative operation
else if (argv[i][0] == '-') {
stck.push(((-1) * stck.pop()) + stck.pop()); // A-B = -B+A
// stck.push(stck.pop()+((-1)*stck.pop())); //A-B = -B+A
} // Both equations equal the same thing (Note I dont use both at the same
// time)
这适用于
int n = (stck.pop());
stck.push(-1*n+stck.pop()); //A-B = -B+A
是的,这是"C++的怪癖":这个特定表达式中参数的求值顺序是未定义的。奇怪的是,你两次都得到相同的结果,但你通常不应该假设这些pop是从左到右评估的!
从链接的文章,部分"隐藏的相关性":
x=f()+g()+h();
对会发生什么有任何疑问吗?在乍一看,这里似乎没有什么问题。3函数将以不确定的顺序调用,其返回值的总和将计算值并执行赋值。但是如果所有3个函数都访问共享的静态或全局他们读取和修改的变量?我们不知道将调用3个函数,因此我们在中不知道对共享数据的读写访问顺序是执行。再一次,另一个序列点挑战。
解决方案:使用临时变量。
stck.push(((-1) * stck.pop()) + stck.pop());
问题是两个pop操作之间没有序列点。这意味着编译器可以自由地按照它想要的任何顺序执行这些操作。编译器可能会选择先执行第二个stack.pop()
,因为它更容易。你需要确保有一个序列点。最简单的方法是使用分号:
subtrahend = stck.pop();
stck.push (stck.pop() - subtrahend);
除了分号之外,还有其他东西可以强制执行特定的操作顺序。例如,您可以非常巧妙地使用逗号运算符或三元运算符。不要那样做。只需进行显而易见的思考,并将至少一个数字放入局部变量中。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- 我是否不正确地集中了这些字符数组?
- 为什么除非我使用 cout,否则我的值不正确?
- 计算幂级数的数学结果不正确
- 中缀到后缀转换器 + 评估程序正确打印到控制台,但不正确地打印到文本文件
- 计算后缀表达式.pop() 返回不正确的值来计算函数
- 后缀否定是不正确的,而且是交流性的