[英]String comparison using general comparators
我試圖看看當我們使用<,>等運算符直接比較字符串時會發生什么。下面代碼中的兩種用法令人驚訝地給出了不同的答案。 他們說的方式不是完全一樣嗎?
#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給出“茉莉花”,而用法2給出“阿拉丁”。
使用時:
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
或類似的內容。
兩種方法都是錯誤的。 字符串沒有有效的>
運算符。
您可以改為比較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;
}
預期結果應始終為“茉莉花”
您實際上並沒有在代碼中比較字符串。 "Alladin"
和"Jasmine"
實際上是const char[]
類型,當您調用max("Alladin", "Jasmine")
時,它們會衰減為指針。 這意味着在函數中,您是在比較字符串的地址而不是內容。
如果要測試std::string
則需要創建std::string
,並將它們傳遞給max
函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.