Bu, C++ 'da programlanırken başıma gelen en garip şey.İncelemeye çalışırken kaybolmuş böcek
Bu benim ana dosyasıdır:
#include <iostream>
#include "lib/utils.h"
using namespace std;
int main(int argc, const char *argv[]) {
cout << bin2dec(101000010);
return 0;
}
ve bu/lib utils.cpp geçerli:
#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;
}
programı herhangi bir uyarı olmadan derler ve çalıştırdığınızda, bu 450
çıkarır. 450, ondalık cinsinden 101000010 değil, 322'dir. İlk garip olan şey, 482 ve 322 arasındaki farkın tam olarak 128 olması. Bu, dönüştürmeyi denediğiniz herhangi bir ikili sayı ile gerçekleşir. Ama gerçekten garip olan şu ki,ve dec
değerini for
içinde çıkarıp işlevini hata ayıklama girişimi yapmaya çalıştığımda, aniden doğru çalışmaya başladı.
Temel olarak, herhangi bir nedenle, std::cout
işlevinden önce bir şey döndürürse, çalışır. Yapmazsanız, sonuca 128 ekler.
ben g ++ 4.6.0 kullanarak ve bunun gibi derleme:
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
İyi bir soru sormak için +1 –
Bu son derece yaygındır - tanımlanmamış davranışların dünyasına hoş geldiniz. –
@Doug Belki de bana sorunun ne olduğunu açıklayabilir misin? –