簡體   English   中英

使用for循環索引問題

[英]Indexing issue with a for loop

我有一個for循環,我正在使用幻燈片操作符,因為我正在使用無符號類型。 從本質上講,歸結為

for (std::size_t i = 6; i --> 0;){
    cout << i;
}

但它輸出從5到0的數字,並且省略6.為什么?

非常感謝你看這個。 我很困惑。

這是一個試金石

  1. 事實上,這個所謂的“操作員”應該謹慎使用,如果有的話。

  2. for循環的條件檢查中更改變量的狀態應該非常謹慎,如果有的話。

最大的輸出是5,因為i是由於條件測試而減少i 在程序控制進入for循環體之前運行條件檢查。

你真的應該重寫循環。 不要i的初始值設置為7,因為這是一個骯臟的黑客。 雖然-->經常與while (並強調,它不太可能在你的編程評論中贏得很多朋友),但我以前從未見過它與for循環一起使用過。

-->不是幻燈片操作符。

編譯器將其理解為兩個不同的運算符-->

所以你的代碼對於編譯器來說是這樣的:

for (std::size_t i = 6; (i--) > 0;){
    cout << i;
}

由於循環條件進入循環的身體之前,檢查i在循環體內的第一次執行之前降低,因此數字的產生順序是5 4 3 2 1 0。

有關更多詳細信息,請參閱此Stack Overflow問題: C ++中的“ - >”運算符是什么?

在for語句中評估此條件之后

i --> 0

我將等於5 所以循環輸出的第一次迭代

5

要實現這種效果,您需要通過以下方式重寫循環

#include <iostream>

int main() 
{
    size_t i = 6;

    do
    {
        std::cout << i;
    } while ( i-- > 0 );

    return 0;
}

程序輸出是

6543210

另一種方式如下

#include <iostream>

int main() 
{
    for ( size_t i = 6; std::cout << i && i != 0; i-- )
    {
        //
    } 

    return 0;
}

當然你可以像這樣編寫循環

const size_t N = 6;

for ( size_t i = N + 1; i-- > 0; )
//              ^^^^^^^    
{
    std::cout << i;
}

但是一般來說,當i的初始值等於std::numeric_limits<size_t>::max()時,這種方法不起作用。因為如果要為此值加1,您將得到0。

使用for循環的一般方法可以采用以下方式

#include <iostream>

int main() 
{
    const size_t N = 6;

    for ( size_t i = N, j = N; j != 0; j = i-- )
    {
        std::cout << i;
    } 

    return 0;
}

它的輸出是

6543210

暫無
暫無

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

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