簡體   English   中英

將字符串的長度分配給 integer:C++

[英]Assigning length of a string to an integer: C++

使用 C++,我想創建一個 for 循環如下( textstd::string ):

 for(int i = text.size(); i >= 0; i--) {
 {

請有人幫我理解為什么我的編譯器(Xcode)要求我將i初始化為無符號長整數,而不是 integer?

我假設以下,但我不知道,我想更好地理解:我相信這與最大值為 2147483647 的 integer 相關,而無符號長整數的最大值為 18,446,744,073,709,551,615。 由於一個字符串最多可以容納 4294967295 個字符,因此使用 integer 是不合適的,因為它的最大值不能代表字符串的最大長度?

最后,unsigned long 數據類型是否合適,還是應該使用 long int?

我修改后的for循環如下:

 for(unsigned long i = text.size(); i >= 0; i--) {
    }

或者

for(long int i = text.size(); i >= 0; i--) {
    }

std::string::size()返回無符號 integer 類型( std::size_t )。 更改i的類型很容易,但引入了另一個問題。 i類型為std::size_t時,循環條件被破壞; 根據定義,無符號類型總是>= 0

還有其他選擇,最直接的是將整個 for 循環修改為:

  1. i聲明為std::size_t
  2. 在條件檢查中將減量作為后減量移動
  3. 完全刪除增量步驟。

結果如下所示:

for (std::size_t i = text.size(); i-- > 0;)
{
    // use text[i] here
}

這將在循環體中從(text.size()-1)枚舉到0 (含),然后中斷循環。 即使字符串為空,它也會起作用。

請注意,這樣的 hijinks 是一個更大問題的標志:首先使用了錯誤的構造。 std::string提供反向迭代器用於向后遍歷字符串內容:

for (auto it = text.rbegin(); it != text.rend(); ++it)
{
    // use *it  to access each character in reverse order
}

這兩種方法中,首選第二種。

如評論中所述, std::string class 的size()成員 function 返回size_t類型的值。 這種類型的確切性質因平台和編譯器而異,但它始終是無符號類型。 通常,它等效於unsigned long intunsigned long long int

因此,為避免編譯器警告初始化int i ,您應該將該循環索引聲明為size_t變量: for (size_t i = text.size(); ...

但是,正如評論中所指出的那樣,您的循環測試條件( i >= 0 )就不好了,因為對於任何無符號類型,該條件永遠不會為假。 因此,您應該將該條件更改為i > 0 您還應該確保基於i變量對test元素的任何訪問都應使用索引值i - 1 (而不僅僅是i ):最后一個元素的size - 1 ,第一個元素的大小為0 ,所以你的循環將保持以下內容:

for (size_t i = text.size(); i > 0; --i) {
    char element = text[i - 1]; // We need to offset our loop index by -1 ...
    // Do something with or to 'element'
    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM