私はループのために私を投げかけている問題に遭遇しています。私は、オーバーロードされた演算子がコードの可読性をどのように高めることができるかを説明しようとしていました。そうするために、私は「牛」という特別な意味を持たない単純なクラスを書いた。 Macでコードをコンパイルすると、コンパイルされ、期待通りに実行されます。Macで正しいコードが正しく、Linuxで正しくありません
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;
}
コンパイル(g++ -Wall -o cow cow.cpp
)は何の警告およびエラーなしを生じず、実行ファイルを作成します。
Linuxボックス利回り上でプログラムを実行する:
$ ./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
$ ./cow
15 : 15 : 0
は、Macの利回り上でプログラムを実行します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ボックスで修正する方法もありますので、ご了承ください。
おかげで、あなたはこの行の未定義の動作に実行している
キース
のような順番で評価する必要があります。これは一般的なバグであり、未定義の動作とシーケンスポイントがあります。 –