これは、C++でプログラミングするときに私に起こったことの中で最も変わったことです。勉強しようとすると消えるバグ
これは私のメインのファイルです:
#include <iostream>
#include "lib/utils.h"
using namespace std;
int main(int argc, const char *argv[]) {
cout << bin2dec(101000010);
return 0;
}
、これは/ libにutils.cppです:
#include <iostream>
#include "utils.h"
int bin2dec(int bin) {
// 101000010
int dec;
//std::cout << ""; // If you uncomment this, it works.
for (int i = 1; bin > 0; i *= 2, bin /= 10) {
if (bin % 2 == 1) {
dec += i;
}
}
return dec;
}
プログラムは警告なしでコンパイルし、実行したとき、それは450
を出力します。 450は10進数で101000010ではありません。最初の奇妙なことは、482と322の差が正確に128であるということです。これは変換しようとする2進数で起こります。しかし、本当に奇妙なのは、bin
とdec
の値をfor
の中に出力しようとすると、関数をデバッグしようとすると、突然正しく動作するようになりました。
基本的には何らかの理由で、関数が返される前に何かstd::cout
が返されても動作します。そうしないと、結果に128が追加されます。
私はG ++ 4.6.0を使用して、次のようにコンパイルしています:
g++ -c -D NDEBUG -O2 -o 10.o 10.cpp
g++ -c -D NDEBUG -O2 -o lib/utils.o lib/utils.cpp
g++ -o 10 -Wl,-S 10.o lib/utils.o lib/menu.o
+1よく尋ねられる質問 –
これは非常に一般的です。未定義の動作の世界へようこそ。 –
@Dougおそらくあなたは私にその質問が何であるか説明することができますか? –