![](/img/trans.png)
[英]Why is there any difference between “++i” and “i++” in a for loop?
[英]Why ++i, i++ are the same in for loop?
for (int i = 0; i < n+1; ++i)
{
sum = sum + i;
}
for (int i = 0; i < n+1; i++)
{
sum = sum + i;
}
兩段因 function 調用參數中的 ++i 和 i++ 而不同。
但它就像 i 只以 0 開頭一樣工作。為什么甚至 ++i 也以 0 開頭?
這兩個片段之間絕對沒有區別。 i++
與++i
僅在與同一表達式中的其他運算符混合時才有意義。 大多數時候這是一個壞主意,因為i++
/ ++i
帶有副作用。
一個通用for
循環,如
for (a; b; c)
{
d
}
相當於
{
a;
while (b)
{
d;
c;
}
}
請注意“增量”表達式c
是如何位於循環體的主語句之后的。
對於您的循環,這意味着它們將等效於:
{
int i = 0;
while (i < n+1)
{
sum = sum + i;
i++; // or ++i
}
}
由於i
的增量直到您計算sum
之后才會發生,因此循環之間沒有實際差異。 兩者都會導致完全相同的結果。
附帶說明:請記住在循環之前將sum
顯式初始化為零,否則它可能具有不確定的值(可能被視為垃圾)。
您發布的兩個 for 循環的行為完全相同。 它們相等的原因,也回答了為什么兩個循環都從0
開始的問題,是增量( i++
或++i
)僅在 {} 中的{expression}執行后發生,並且在每次執行后發生.
您的代碼將產生相同的結果。
下面的代碼會產生不同的結果。
int i = 0;
while (i < 5) {
printf("%d\n", ++i);
}
// 1
// 2
// 3
// 4
// 5
i = 0;
while (i < 5) {
printf("%d\n", i++);
}
// 0
// 1
// 2
// 3
// 4
在我的示例中,底部 for 循環打印出 0 而頂部 for 循環不打印的原因是因為printf
和i++/++i
形成一個組合表達式,其中頂部i
遞增,然后從 memory 訪問,而在底部循環i
是從 memory 訪問,然后遞增。
這些for
循環的最后一個子句中的i++
和++i
表達式都將i
遞增作為副作用,並且由於未使用表達式的值,因此它們具有完全相同的效果,即副作用。
以下是其他替代方法,它們的行為相同並且應該產生相同的代碼:
for (int i = 0; i < n+1; i += 1) {
sum = sum + i;
}
和
for (int i = 0; i < n+1; i = i + 1) {
sum = sum + i;
}
但是請注意,如果n
是值為INT_MAX
的int
,則n+1
具有未定義的行為。 編寫此循環的一種更安全的方法是:
for (int i = 1; i <= n; i++) {
sum = sum + i;
}
但是<=
運算符在n
為INT_MAX
時存在相同的問題:當i
達到INT_MAX
時,未定義的行為將發生在i++
部分...
這是避免這種極端情況的替代方法:
if (n > 0) {
for (int i = 1; i < n; i++) {
sum = sum + i;
}
sum = sum + n;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.