我试图看看当我们使用<,>等运算符直接比较字符串时会发生什么。下面代码中的两个用法令人惊讶地给出了不同的答案。他们说话的方式不一样吗?
#include <iostream>
template <class T>
T max(T a, T b)
{
//Usage 1:
if (a > b) return a; else return b;
//Usage 2:
return a > b ? a : b ;
}
int main()
{
std::cout << "max(\"Alladin\", \"Jasmine\") = " << max("Alladin", "Jasmine") << std::endl ;
}
用法1给出“Jasmine”,而用法2给出“Alladin”。
答案 0 :(得分:4)
使用时:
max("Alladin", "Jasmine")
相当于使用:
max<char const*>("Alladin", "Jasmine")
在函数中,您最终会比较指针。调用的结果将取决于指针的值。它不能保证是可预测的。
也许您想使用:
max(std::string("Alladin"), std::string("Jasmine"))
或
max<std::string>("Alladin", "Jasmine")
请注意,某些编译器在您使用时可能会选择std::max
。您可能希望将max
更改为my_max
或类似的内容。
答案 1 :(得分:3)
两种方法都错了。字符串没有有效的>
运算符。
您可以比较std::string
:
#include <iostream>
#include <string>
template <class T>
T my_max(T a, T b)
{
return a > b ? a : b;
}
int main()
{
std::string a = "Alladin";
std::string b = "Jasmine";
std::cout << "my max: " << my_max(a, b) << std::endl;
//standard max function:
std::cout << "standard max: " << max(a, b) << std::endl;
}
预期结果应始终为“Jasmine”
答案 2 :(得分:3)
您实际上并未比较代码中的字符串。 "Alladin"
和"Jasmine"
实际上属于const char[]
类型,当您致电max("Alladin", "Jasmine")
时,它们会变为指针。这意味着在您的函数中,您要比较字符串的地址而不是内容。
如果您打算测试std::string
,则需要创建std::string
并将其传递给max
函数。