gpt4 book ai didi

c++ - 为什么这段代码打印 0

转载 作者:行者123 更新时间:2023-11-28 07:21:30 25 4
gpt4 key购买 nike

为什么下面的代码打印0?即为什么变量 a 位于变量 d 之后,即使在它们之间声明了指针变量 c

#include<iostream>
using namespace std;

int main () {
unsigned int a = 100;
unsigned int &b = a;
unsigned int *c = &b;
unsigned int d = (unsigned int)(c);
int e = &d - c;
int &f = e;
e ++;
cout << e << " " << endl;
return 0;
}

最佳答案

向后工作:

e ++;
cout << e << " " << endl;

如果打印出 0,那么在执行这段代码之前 e 的值一定是 -1

int e = &d - c;

所以上面地址减法的结果一定是-1

unsigned int a /* = whatever, the value of a doesn't matter */;
unsigned int &b = a;
unsigned int *c = &b;
unsigned int d /* = whatever, the value of d doesn't matter */;

b是对a的引用,所以&b等同于&a

因此 &d - c 等同于 &d - &a,并且该减法产生 -1

结论:d的地址是a的地址sizeof (unsigned int) 之后字节。 (指针减法按指向类型的大小缩放。)

可能。

事实上,将指向两个独立定义的对象的指针相减的行为是未定义。该标准几乎没有说明它应该做什么。

在实践中,编译器可能会生成最简单的指针减法代码,并且该简单代码可能会将不相关的指针视为它们是可比较的,即使语言没有说明他们是。

鉴于您的程序输出,bd 很可能恰好彼此相邻分配。没有人说必须按照声明变量的顺序分配声明的变量。如果您希望按定义顺序在内存中分配对象,请将它们放入 struct 或使它们成为数组的元素。

如果您在不同的系统上运行同一个程序,或者在具有不同编译器的同一系统上,或者在具有不同编译器选项的同一编译器的同一系统上运行,同样的程序也可能会产生不同的结果。原则上,它甚至可以在一切相同但月相不同的情况下表现不同。

并且允许编译器假设您的代码行为定义明确,并执行仅在该假设下有效的转换。实际上,通过减去两个不相关的指针,您已向编译器 promise 它们都指向同一数组对象的元素或刚好超过它的末尾(其中单个对象被视为 1 元素数组)(或两者都是空指针;这是 C 和 C++ 之间的一个区别)。你对编译器撒了谎,这意味着它对你没有进一步的义务。

不要那样做。

关于c++ - 为什么这段代码打印 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19392531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com