在有关C的信誉良好的来源中,在讨论了&
运营商之后给出了以下信息:
...有点不幸的是,术语[地址]仍然存在,因为它混淆了那些不知道地址是什么的人,并误导那些做的人:把指针当作地址通常会导致悲伤...... .
我读过的其他材料(来自同等声誉的来源,我会说)总是毫不掩饰地将指针和&
操作符称为给出内存地址.我很想继续寻找事情的实际情况,但是当信誉良好的消息来源不同意时,这很难.
现在我有点困惑 - 究竟什么是指针,那么,如果不是内存地址?
PS
作者后来说:......我将继续使用"地址"一词,因为发明一个不同的 [术语] 会更糟.
我在教程中读到C++包含整个C编程语言.
不过我也看过,在地方这样说
如果你学习C++,你最终将学习大部分C语言,并且随着时间的推移会学习一些语言之间的差异.
所以我的问题只有这个:
如果我非常了解C++,我最终会学习"真正的"C语言(没有任何"差异"),因为完整的C90语言包含在C++ 11中吗?
因此,标准(参考N1570)说明了以下关于比较指针的内容:
C99 6.5.8/5关系运算符
比较两个指针时,结果取决于指向的对象的地址空间中的相对位置.... [在聚合中剪切明显的比较定义] ... 在所有其他情况下,行为未定义.
这个UB实例的基本原理是什么,而不是指定(例如)转换intptr_t
和比较它?
是否存在一些机器架构,其中指针的合理总排序难以构建?是否存在一些优化或分析,不受限制的指针比较会阻碍?
这个问题的删除答案提到这条UB允许跳过段寄存器的比较并且仅比较偏移.保存特别有价值吗?
(同样删除的答案,以及此处的答案,请注意,在C++中,std::less
需要对指针实现总顺序,无论正常比较运算符是否执行.)
二者clang
并g++
似乎是符合在C++标准的段落[expr.const]/5的最后一个版本.以下代码段为两个编译器打印11.查看实例:
#include <iostream>
void f(void) {
static int n = 11;
static int* temp = &n;
static constexpr int *&&r = std::move(temp);
std::cout << *r << '\n';
}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
根据我对本段的理解,两个编译器都应该打印2016
下面的代码.但他们没有.因此,我必须得出结论,代码显示未定义的行为,因为clang
打印任意数字并g++
打印0
.我想知道为什么它是UB,考虑到例如标准的N4527草案?实例.
#include <iostream>
void f(void) {
static int n = 11;
static int m = 2016;
static int* temp = &n + 1;
static constexpr int *&&r = std::move(temp);
std::cout << …
Run Code Online (Sandbox Code Playgroud)