为什么两个字符串文字中最大值的输出是错误的?
Why is the output of the maximum of two string literals wrong?
谁能解释一下,为什么这段代码的输出是“C”?
#include <iostream>
using namespace std;
template<class X>
X maximum(X a,X b)
{
if(a > b)
return a;
else
return b;
}
int main() {
cout << maximum("C","D") << endl;
}
请注意,在您的情况下,类型 X
将被推断为 const char*
,因此您正在比较两个 const char *
,即两个字符串文字的地址。
如果你想得到预期的结果,使用类似下面的东西
cout << maximum("C"s, "D"s) << endl;
传递 std::strings
而不是传递字符串文字的地址。
或者使用字符而不是使用字符串文字,即 'C'
和 'D'
,在这种情况下,X
将被推断为 char
。
见Why is "using namespace std;" considered bad practice?
当你使用maximum("C","D")
时,模板参数是char const*
。你最终比较了两个指针。无法保证哪个指针会更大。你有不确定的行为。
如果要比较字符串"C"
和字符串"D"
,可以使用:
cout << maximum(std::string("C"), std::string("D")) << endl; // or
cout << maximum("C"s, "D"s) << endl; // or
cout << maximum<std::string>("C", "D");
如果您只想比较字符 C
和 D
,您应该使用
cout << maximum('C', 'D') << endl;
如果您希望它也适用于 cstring-literals,请添加专业化。
#include <cstring>
template<class X>
X maximum(X a, X b)
{
return a > b ? a : b;
}
template<>
char const* maximum<char const*>(char const* a, char const* b)
{
return std::strcmp(a, b) > 0 ? a : b;
}
谁能解释一下,为什么这段代码的输出是“C”?
#include <iostream>
using namespace std;
template<class X>
X maximum(X a,X b)
{
if(a > b)
return a;
else
return b;
}
int main() {
cout << maximum("C","D") << endl;
}
请注意,在您的情况下,类型 X
将被推断为 const char*
,因此您正在比较两个 const char *
,即两个字符串文字的地址。
如果你想得到预期的结果,使用类似下面的东西
cout << maximum("C"s, "D"s) << endl;
传递 std::strings
而不是传递字符串文字的地址。
或者使用字符而不是使用字符串文字,即 'C'
和 'D'
,在这种情况下,X
将被推断为 char
。
见Why is "using namespace std;" considered bad practice?
当你使用maximum("C","D")
时,模板参数是char const*
。你最终比较了两个指针。无法保证哪个指针会更大。你有不确定的行为。
如果要比较字符串"C"
和字符串"D"
,可以使用:
cout << maximum(std::string("C"), std::string("D")) << endl; // or
cout << maximum("C"s, "D"s) << endl; // or
cout << maximum<std::string>("C", "D");
如果您只想比较字符 C
和 D
,您应该使用
cout << maximum('C', 'D') << endl;
如果您希望它也适用于 cstring-literals,请添加专业化。
#include <cstring>
template<class X>
X maximum(X a, X b)
{
return a > b ? a : b;
}
template<>
char const* maximum<char const*>(char const* a, char const* b)
{
return std::strcmp(a, b) > 0 ? a : b;
}