使用gdb调试我的c ++代码时,变量值在函数调用中是荒谬的

时间:2016-01-11 17:36:57

标签: c++ gdb

当我用GDB调试我的c ++代码时,发生了一些荒谬的事情。 一个简单的例子:

#include <iostream>
using namespace std;

void square(int a, int y)
{
    int temp = 7;
    a = y;
    y = temp;
    temp = 6;
}
void square2(int a, int y)
{
    int temp = 7;
    a = temp;
    y = temp;
    temp = 6;
}

int main()
{
    int a = 0, y = 5;
    square(a, y);
    square2(a, y);
    return 0;
}

编译cmd为g++ -g -std=c++11 test.cpp -o test

当我启动GDB并进入正方形时,当​​我到达a = y表达式时,局部变量temp是7。但是当我到达temp = 6时,我尝试打印a和y的变量值,即0和7.这很奇怪,因为a应该是5,y应该是7,因为我担心。 AND在square2的调用中,到达temp = 6的同一位置,gdb打印的a和y的值为0和5,完全保持不变!

有人能够弄清楚代码执行过程中发生了什么吗?这让我很生气!

1 个答案:

答案 0 :(得分:1)

如果您的代码没有可见的副作用,编译器可以自由地对代码进行任何类型的优化,例如:不改变变量的值。打开优化的好编译器实际上应该删除所有代码。

请改为尝试:

#include <iostream>
using namespace std;

void square(int a, int y)
{
    int temp = 7;
    a = y;
    y = temp;
    cout << "a=" << a << " y=" << y << endl;
    temp = 6;
}
void square2(int a, int y)
{
    int temp = 7;
    a = temp;
    y = temp;
    cout << "a=" << a << " y=" << y << endl;
    temp = 6;
}

int main()
{
    int a = 0, y = 5;
    square(a, y);
    square2(a, y);
    return 0;
}

然后你会得到正确的值。