C++ 相同的代码在Mac上正确,在Linux上不正确

C++ 相同的代码在Mac上正确,在Linux上不正确,c++,linux,macos,C++,Linux,Macos,我遇到了一个让我陷入困境的问题(没有双关语的意思)。我试图说明重载运算符如何大大提高代码的可读性。为此,我编写了一个名为“cow”的简单类(没有特殊含义)。当我在Mac上编译代码时,它编译得很干净,并按预期执行 在Linux机器(Ubuntu)上编译的完全相同的代码也可以干净地编译,但执行结果不正确 在某个地方,我肯定错过了一些明显的东西,但我没有看到 代码如下: #include <iostream> #include <sstream> using namespace

我遇到了一个让我陷入困境的问题(没有双关语的意思)。我试图说明重载运算符如何大大提高代码的可读性。为此,我编写了一个名为“cow”的简单类(没有特殊含义)。当我在Mac上编译代码时,它编译得很干净,并按预期执行

在Linux机器(Ubuntu)上编译的完全相同的代码也可以干净地编译,但执行结果不正确

在某个地方,我肯定错过了一些明显的东西,但我没有看到

代码如下:

#include <iostream>
#include <sstream>
using namespace std;

class cow {
public:
    cow();
    cow(int i);
    int add(int a);
    int add(string str);
    int get() const;
private:
    int i;
};

cow::cow() {
    i = 0;
}

cow::cow(int j) {
    i = j;
}

int cow::add(string str) {
    stringstream s;
    int num;
    s << str;
    s >> num;

    return i += num;
}

int cow::add(int a) {
    return i += a;
}

int cow::get() const {
    return i;
}

int main() {
    cow i(15);
    cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");
    return 0;
}
在Mac上执行程序会产生:

$ ./cow
15 : 30 : 15

MAC上的C++编译器是:

$ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.38)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Linux上的C++编译器是:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
任何关于导致这种行为的原因的建议,以及在Linux机器上修复它的方法,都是值得赞赏的

谢谢


Kees

您在这方面遇到了未定义的行为:

cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");
 cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");

cout您在这一行遇到了未定义的行为:

cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");
 cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");

cout由于在一个表达式中多次更改实例的状态,因此得到了一个未定义的行为。通过C++标准,您对该代码的调用<代码> i>代码>:

cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");
 cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");

cout由于在一个表达式中多次更改实例的状态,因此得到了一个未定义的行为。通过C++标准,您对该代码的调用<代码> i>代码>:

cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");
 cout << i.get() << " : " << i.add(15) << " : " << i.add("-15.0");

cout导致此问题的原因是一个常见错误,行为和序列点未定义。导致此问题的原因是一个常见错误,行为和序列点未定义。感谢您的回复。似乎我还需要提高我的搜索技能,因为这是一个重复的问题。抱歉。老实说,我不太同意主持人将问题标记为重复的观点。当然,引用的文章对这个案例给出了全面的解释,但关键是当有人刚开始学习C++时,他们很可能不知道“序列点”是什么意思,或者,由于缺乏经验,他们无法意识到您所描述的效果是对序列点概念的误解。感谢您的回复。似乎我还需要提高我的搜索技能,因为这是一个重复的问题。抱歉。老实说,我不太同意主持人将问题标记为重复的观点。当然,引用的文章对这个案例做了全面的解释,但关键是当有人刚开始学习C++时,他们很可能不知道“序列点”是什么意思,或者因为缺乏经验,他们无法意识到你所描述的效果是对序列点概念的误解的标志。