当用gdb调试我的c++代码时,函数调用中的变量值是荒谬的
Variable value is ridiculous in function call when debugging my c++ code with 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;
}
编译命令为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;
}
然后您将打印出正确的值。
相关文章:
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 函数调用在常量表达式中必须具有常量值
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 在宏函数C++中设置宏变量值
- 在函数名称中使用变量值
- 指针和将变量值从一个函数传递到另一个函数.如何使用指针传递变量值
- GetEnvironmentVariable():这个函数是第一个用变量值检查nSize吗?
- 根据C 中的变量值创建成员函数
- 从c++调用lua函数时,如何使表和变量值保持不变
- C++构造函数调用变体
- 如何在c/c++中使函数调用之间的变量值持久化
- 如何通过wprintf函数打印uint32_t变量值
- 如何在 c++ 中将 1 个函数变量值发送到另一个函数
- 无法弄清楚出了什么问题,函数等之后的类中没有正确的变量值
- 当用gdb调试我的c++代码时,函数调用中的变量值是荒谬的
- c++11:用向量的元素调用变差函数
- 变量值在没有scanf调用的情况下正在更改
- 将 main 中的变量值更改为可用于其他函数 (c++)
- 类中的函数用于多个变量值
- 函数局部变量在函数调用之间保持不变