这是我用C++编程时遇到过的最奇怪的事情.
这是我的主要文件:
#include <iostream>
#include "lib/utils.h"
using namespace std;
int main(int argc, const char *argv[]) {
cout << bin2dec(101000010);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是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;
}
Run Code Online (Sandbox Code Playgroud)
程序编译时没有警告,运行时会输出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
Run Code Online (Sandbox Code Playgroud)
Eva*_*van 23
你没有初始化dec.
int dec = 0;
Run Code Online (Sandbox Code Playgroud)
650*_*502 16
小错误是你没有初始化dec
变量.
更大的错误是你不习惯添加-Wall
和-O2
编译时(因为你编写的程序会变得更复杂,会导致很多痛苦).
-Wall
启用所有警告并-O2
需要优化(优化包括将引发有关未初始化变量的警告的代码路径分析).
归档时间: |
|
查看次数: |
528 次 |
最近记录: |