[英]Indexing issue with a for loop
我有一個for
循環,我正在使用幻燈片操作符,因為我正在使用無符號類型。 從本質上講,歸結為
for (std::size_t i = 6; i --> 0;){
cout << i;
}
但它輸出從5到0的數字,並且省略6.為什么?
非常感謝你看這個。 我很困惑。
這是一個試金石
事實上,這個所謂的“操作員”應該謹慎使用,如果有的話。
在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.