在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不是十进制的101000010,322是。第一个奇怪的是482和322之间的差异恰好是128.这种情况发生在您尝试转换的任何二进制数字上。但真正奇怪的是,当我试图在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
答案 0 :(得分:23)
你没有初始化dec。
int dec = 0;
答案 1 :(得分:16)
小错误是您没有初始化dec
变量。
更大的错误是你在编译时不习惯添加-Wall
和-O2
(因为你编写的程序会变得更复杂,会导致很多痛苦)。
-Wall
启用所有警告,-O2
需要优化(优化包括会引发有关未初始化变量的警告的代码路径分析)。
答案 2 :(得分:3)
int dec;
创建dec
但从不给它一个初始值(如0)。然后,您可以为其添加值,并以随机结果结束。
答案 3 :(得分:3)
您需要在函数中将dec
初始化为零:
int dec = 0;
通过不初始化它,它从变量位置的内存中的任何随机crud开始。对cout <<
的调用可能会影响该区域的内容,因此会发生变化。顺便说一句,当我尝试你的代码时,我没有得到450
。我得到了134514688
,这给出了一个例子。
答案 4 :(得分:0)
很简单,你的问题尖叫堆栈或堆粉碎给我 - 可能是堆栈,因为函数的所有操作都在堆栈上。如果不在程序的其他地方调用一些讨厌的未定义行为,就不会遇到这种问题。
编辑:哦是的 - 你可以从初始化dec
开始,仅举例来说。