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

Variable value is ridiculous in function call when debugging my c++ code with gdb

本文关键字:函数调用 变量值 荒谬 调试 gdb 我的 c++ 代码 当用      更新时间:2023-10-16

当我用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;
}

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

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

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

如果您的代码没有明显的副作用,编译器可以对代码进行任何类型的优化,例如不更改变量的值。一个启用了优化的好编译器实际上应该删除所有代码。

试试这个:

#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;
}

然后您将打印出正确的值。