代码之家  ›  专栏  ›  技术社区  ›  f877576

函数std::max()C++?

  •  1
  • f877576  · 技术社区  · 3 年前

    我在试这个功能 max() 使用 visual studio 2022版本17.7.1

    #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
    

    但是当我使用 代码块 :

    #包括<iostream>
    #包括<矢量>
    #包括<算法>
    使用命名空间std;
    int main(){
    cout<<max(“5”,“4”)<<“\n”;
    返回0;
    }
    

    输出为:

    5.
    

    当我将代码更改为:

    #包括<iostream>
    #包括<矢量>
    #包括<算法>
    使用命名空间std;
    int main(){
    cout<<max(“4”,“5”)<<“\n”;
    返回0;
    }
    

    输出为:

    4.
    

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

    1 回复  |  直到 3 年前
        1
  •  6
  •   Vlad from Moscow    3 年前

    在您的电话中 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> 。