尝试研究它时会消失的bug

Ger*_*set 10 c++ debugging

这是我用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.这种情况发生在您尝试转换的任何二进制数字上.但是,什么是真正奇怪的是,当我试图输出值bindec内部的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)

  • @Gerado你不应该:P错误越多,你犯的错误越"愚蠢":P我们都去过那里,我们都去了那里 (2认同)

650*_*502 16

小错误是你没有初始化dec变量.

更大的错误是你不习惯添加-Wall-O2编译时(因为你编写的程序会变得更复杂,会导致很多痛苦).

-Wall启用所有警告并-O2需要优化(优化包括将引发有关未初始化变量的警告的代码路径分析).

  • 打败我.总是使用-Wall.有时候 - 墙是不够的.使用-Wall和Optimization进行编译会发现未初始化的变量. (2认同)