在兩個字符陣列之間進行比較時,比較運算子如何作業?
考慮以下程式,
#include <iostream>
using namespace std;
int main()
{
char arr1[5] = { 'T','e','s','t' };
char arr2[10] = { 't','e' };
if (arr1 < arr2)
cout << "Yes";
else if (arr1 > arr2)
cout << "No";
else
cout << "0";
}
我知道的方法是應該列印Yes,因為第一個字符arr1為ASCII值84,而第一個字符的ASCII值arr2是116因此從技術上講應該列印是。
但是,此程式會提供No在 Visual Studio 上運行時的輸出。
我認為它可能是比較字符陣列的地址。為了測驗這一點,我交換了變數名并運行了這個程式,
#include <iostream>
using namespace std;
int main()
{
char arr2[5] = { 'T','e','s','t' };
char arr1[10] = { 't','e' };
if (arr1 < arr2)
cout << "Yes";
else if (arr1 > arr2)
cout << "No";
else
cout << "0";
}
但這再次Yes作為輸出給出,這意味著字符陣列的地址在比較中無關緊要。
誰能告訴這個比較是如何進行的?
uj5u.com熱心網友回復:
在 if 陳述句的條件下
if (arr1 < arr2)
這兩個陣列都被隱式轉換為指向它們第一個元素的指標,并比較這些地址,導致operator <.
注意你是否會比較像這樣的字串文字
if ( "Hello" == "Hello" )
//...
那么運算式的值可以是 true 或 false 取決于編譯器選項:相同的字串文字是作為一個字串文字存盤還是作為單獨的字串文字存盤。
至于不包含字串的字符陣列的比較,則可以使用標準演算法std::lexicographical_compare。
否則,如果字符陣列包含您的示例中的字串,那么您可以使用標準的 C 字串函式strcmp。
這是一個演示程式
#include <iostream>
#include <algorithm>
#include <cstring>
int main()
{
char arr1[5] = { 'T','e','s','t' };
char arr2[10] = { 't','e' };
if (std::lexicographical_compare( arr1, arr1 4, arr2, arr2 2 ))
{
std::cout << "The array arr1 is less than the array arr2\n";
}
if ( std::strcmp( arr1, arr2 ) < 0 )
{
std::cout << "The array arr1 is less than the array arr2\n";
}
}
程式輸出是
The array arr1 is less than the array arr2
The array arr1 is less than the array arr2
uj5u.com熱心網友回復:
它肯定比較地址而不是陣列項的值。您不應該以這種方式依賴地址分配。
無論如何,您可以檢查:
- string.h for strcmp() // 需要用 '\0' 終止你的字符陣列
- 字串::比較()
- std::lexicographical_compare()
uj5u.com熱心網友回復:
考慮使用 string_view,它幾乎沒有任何開銷。https://en.cppreference.com/w/cpp/string/basic_string_view
注意:這個例子在編譯時比較字串以便于測驗,但它也可以在運行時作業(沒有 constexpr)
#include <cassert>
#include <string_view>
int main()
{
constexpr std::string_view cvw1{ "test" };
constexpr std::string_view cvw2{ "te" };
static_assert(cvw1 > cvw2);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/399457.html
下一篇:條件分頁javascript
