C++ 编译器发生了什么?我不明白 #包括 int main(int argc,char*argv[]){ int x=3; int-y; int*px=&x; y=*px--; *px=5; 标准::cout

C++ 编译器发生了什么?我不明白 #包括 int main(int argc,char*argv[]){ int x=3; int-y; int*px=&x; y=*px--; *px=5; 标准::cout,c++,C++,在这一行: #include <iostream> int main(int argc, char *argv[]) { int x = 3; int y; int *px = &x; y = *px--; *px = 5; std::cout << "&x = " << &x << " px = " << px <&l

在这一行:

#include <iostream>
int main(int argc, char *argv[]) {
    int x = 3;
    int y;
    int *px = &x;
    y = *px--;
    *px = 5;
    std::cout << "&x = " << &x << " px = " << px << " &px = " << &px << "&y =" << &y; // strange line
    std::cout << "x = " << x << " y = " << y << std::endl;
    std::cin.get();
}
您正在通过计算无效的指针进行调用。
px
指向一个
int
,并且不能递减。即使可以递减
px
,也要取消对它的引用:

y = *px--;
不允许,因为它未指向有效内存


程序可能会做任何事情,分析它产生的输出是没有意义的,至少在语言规则范围内是这样。

你只是在堆栈中捣乱。这都是未定义的行为。不要假设地址位置
x
y
是相关的。除非你试图理解gcc i是如何工作的实现未定义的行为。但是它不是必需的。如果你想解释发生了什么,你需要看看汇编代码。我们从低级编码发展到高级编码,以避免类似的奇怪事情。遵循语言的界限,它会对你很好。
*px=5更改y的值
否。这就是just正在调用。相反,使用不同的编译器可能会使程序崩溃,或者当您明天编译或下一个版本发布时,g++可能会输出不同的数字。与其尝试猜测为什么会发生这种行为,不如查看汇编代码。它会告诉您为什么会发生这种情况。玩20次猜谜游戏,尝试找出undE-FEED行为并不是严肃的C++用户喜欢做的事情。我们只是避免不明确的行为。这让我想起了笑话:“医生,当我这么做的时候,它会很疼!”但是我打印出了&x和&y,&x=0x65fe1c&y=0x65fe18,它不是px指向y吗?不,一点也不。任何东西都不需要指向任何地方。这就是UB的意思。但是仍然无法解释为什么当我使用&y时它变成了x=3y=5,我没有使用任何关于y的引用或地址,它变成了x=3y=3,
*px = 5;