Visual Studio 函数std::max()C++?[副本]

y4ekin9u  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(102)

此问题已在此处有答案

Why is the output of the maximum of two string literals wrong?(3个答案)
上个月关门了。
我正在使用visual-studio 2022 Version 17.7.1尝试函数max()

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    cout << max("5", "4") << "\n";
    return 0;
}

输出为:

4

当我把代码改为:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    cout << max("4","5") << "\n";
    return 0;
}

输出为:

5

但是当我使用代码块时:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    cout << max("5", "4") << "\n";
    return 0;
}

输出为:

5

当我把代码改为:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    cout << max("4","5") << "\n";
    return 0;
}

输出为:

4

所以visual-studio 2022 Version 17.7.1每次都选择第二个参数,代码块每次都选择第一个参数(我猜是这样),但为什么?这是因为参数被转换为const char*,所以每次比较(在visual-studio 2022版本17.7.1和代码块中)都是在两个指针之间,所以它是在两个地址之间?

olhwl3o2

olhwl3o21#

std::max的调用中,有字符串字面量的比较地址。在C中,这种比较的结果是未指定的(在C中是未定义的行为)。
C
20标准(7.6.9关系运算符)
1.左值到右值(7.3.2)、数组到指针(7.3.3)和函数到指针(7.3.4)的标准转换是在操作数上执行的。如果两个操作数在这些转换之前都是数组类型,则不推荐进行比较(D.5)
4将不相等的指针与对象81进行比较的结果是按照符合以下规则的偏序来定义的:
(4.1)如果两个指针指向同一个数组的不同元素,或者指向其子数组,则指向下标较高的元素的指针需要比较大。
(4.2)- 如果两个指针指向同一对象的不同非静态数据成员,或者指向这些成员的子对象,递归地,指向后声明的成员的指针需要比较大,前提是两个成员具有相同的访问控制(11.9),两个成员都不是零大小的子对象,并且它们的类不是并集。
(4.3)-否则,两个指针都不需要比另一个指针大
相反,你应该写

#include <cstring>

//...

std::cout << std::max( "5", "4", []( const auto &s1, const auto &s2 ) { return std::strcmp( s1, s2 ) < 0; } ) << "\n";
std::cout << std::max( "4", "5", []( const auto &s1, const auto &s2 ) { return std::strcmp( s1, s2 ) < 0; } ) << "\n";

在这种情况下,输出将是

5
5

也就是说,要比较两个字符串,你需要使用标准的字符串函数strcmp,在头文件<cstring>中声明。

相关问题