将 std::sort 与指向整数变量的指针一起使用会产生意外的输出

Using std::sort with pointers to integer variables produces unexpected output

本文关键字:输出 意外 一起 指针 sort 整数 变量 std      更新时间:2023-10-16

我决定编译并运行这段代码(出于好奇),G++编译器成功编译了该程序。我期待看到编译错误或运行时错误,或者至少 a 和 b 的值交换(作为 5> 1),因为std::sort()函数是用两个指向整数的指针调用的。 (请注意,我知道这不是一个好的做法,我基本上只是在玩指针)

#include <iostream>
#include <algorithm>
int main() {
int a{5};
int b{4};
int c{1};
int* aptr = &a;
int* bptr = &b;
std::sort(aptr, bptr);
std::cout << a << ' ' << b << ' ' << c << 'n';
return 0;
}

但是,在执行程序时,我得到的输出是这样的:

5 4 1

我的问题是,C++如何允许对std::sort()函数进行这种调用?它最终如何没有实际对 a 和 b 的内存地址之间的所有内容进行排序(甚至可能包括内存中的垃圾值)?

我的意思是,如果我们尝试使用这样的 C 样式数组(std::sort(arr, arr+n)),它将成功地对 C 样式数组进行排序,因为arrarr+n基本上只是指针,其中n是数组的大小,arr是指向第一个元素的指针。

(如果这个问题听起来很愚蠢,我很抱歉。我还在学习C++。

您的程序格式不正确,无需诊断。 您将不构成范围的指针传递给 std 算法。

程序的任何行为都符合C++标准。

编译器围绕以下事实进行优化:指向不相关对象的指针是无与伦比的,并且它们的差异是未定义的。 这里的排序会绊倒如此多的 UB,优化器可以疯狂地消除分支(因为任何带有 UB 的分支都可以被消除并替换为替代分支(无论备用分支是 UB 的合法结果是什么代码))。

因此,良好的C++编码风格侧重于避免使用UB和IL-NDR代码。

C++接受您的代码,因为它在语法上是正确的。但它不起作用,因为 sort(it1, it2) 期望它 1 一个是数组的某个起始位置,而 it2 是同一数组的结束位置。您为 sort 函数提供了两个不同的数组,它们可能会产生以下两种情况中的任何一种:

positionof(it1) <positionof(it2):>假设在计算机的内存数组中,A和B存储在这样的5(a),-1,-2,10,4(b)中。 然后排序函数将从 5 到 4 排序,结果为:-2(a),-1,4,5,10(b)。

positionof(it1)> positionof(it2)(机器的情况):sort 函数不会像left_position> right_position那样做任何事情。