当我用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,完全保持不变!
有人能够弄清楚代码执行过程中发生了什么吗?这让我很生气!
答案 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;
}
然后你会得到正确的值。