调试my 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; } #包括 使用名称空间std; 空心正方形(整数a,整数y) { 内部温度=7; a=y; y=温度; 温度=6; } 空位平方2(整数a,整数y) { 内部温度=7; a=温度; y=温度; 温度=6; } int main() { int a=0,y=5; 正方形(a,y); 平方2(a,y); 返回0; }

调试my 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; } #包括 使用名称空间std; 空心正方形(整数a,整数y) { 内部温度=7; a=y; y=温度; 温度=6; } 空位平方2(整数a,整数y) { 内部温度=7; a=温度; y=温度; 温度=6; } int main() { int a=0,y=5; 正方形(a,y); 平方2(a,y); 返回0; },c++,gdb,C++,Gdb,编译命令是g++-g-std=c++11 test.cpp-o test 当我启动GDB并进入square时,当我到达a=y表达式时,本地变量temp肯定是7。但是当我到达temp=6时,我尝试打印a和y的变量值,即0和7。这很奇怪,正如我所关心的,a应该是5,y应该是7。 在调用square2时,到达相同的位置temp=6,gdb打印的a和y的值分别为0和5,完全保持不变 有人能知道代码执行过程中发生了什么吗?那真让我发疯 如果您的代码没有明显的副作用,编译器可以自由地对代码进行任何类型的优化

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

当我启动GDB并进入square时,当我到达
a=y
表达式时,本地变量temp肯定是7。但是当我到达
temp=6
时,我尝试打印a和y的变量值,即0和7。这很奇怪,正如我所关心的,a应该是5,y应该是7。 在调用square2时,到达相同的位置
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;
}
#包括
使用名称空间std;
空心正方形(整数a,整数y)
{
内部温度=7;
a=y;
y=温度;

您是否需要通过引用传递。
void square(int-a,int-y)=>void square(int-a,int-y)
无法在ideone.com上复制。
square
内部的打印提供
a5
y7
。对于
square2
y7
。请参见@Daniel-您应该添加用于打印的代码-可能这是您的问题。@NathanOliver-这不是所述问题的解决方案。Altho如果你不违反C和C++规则,那么在本地重写函数参数是非正统的。调试器的参数是“登记”的范围名称而不是登记表中的临时值。拆解代码并检查寄存器和堆栈。标准输出是正确的。它似乎是GCC4.8版本,升级到5.3.0后,gdb打印的值正是我所期望的值。