簡體   English   中英

增量++ i,i ++和i + = 1

[英]Increment ++i, i++ and i+=1

我是C ++的初學者。 我的理解是: -

i ++首先執行,然后遞增,++ i先遞增,然后執行,i + = 1遞增1,然后執行。 但是在FOR循環中:

for (i=0;i<10;i++)
for (i=0;i<10;++i)

上面這兩個循環確實沒有區別。

這是另一個計算從1到100的所有整數的總和:

int i=1, sum=0;
while (i<=100)
{
    sum+=i;
    i++;         //i+=1;    ++i;
}
cout<<sum<<" "<<i<<endl;
return 0;

但是如果我用i + = 1或++ i替換i ++,它們都會返回5050和101的總和。所以我真的看不出它們有什么不同。

那么有人可以向我解釋這個嗎? 編程中哪一個最常用? 謝謝!!

你是對的。 在您的示例中沒有區別。

但這里有:

int i = 0;
cout << i++ << endl;  //prints 0
cout << i   << endl;  //prints 1

VS

int i = 0;
cout << ++i << endl;  //prints 1
cout <<   i << endl;  //prints 1

編程中哪一個最常用?

大多數情況下, ++是語句中唯一的操作(FYI, for循環有三個語句)。

如果不是,那么它可能很重要,你將使用任何一個給你正確的行為。

FYI

一些開發人員認為,如果pre和postfix運算符應該總是單獨使用(不是大語句的一部分)。 它們可能導致令人困惑的代碼,甚至是未定義的行為。

例如,

int i = 0;
cout << i++ + i++ << endl;

有未定義的行為。

那么有人可以向我解釋這個嗎?

什么i++的作用是返回的當前值i ,然后由一個增加它,並++i第一次增加i1 ,然后返回的值i

看看這個,例如:

i = 5;
j = 5;
res = i++;    //res = 5, but i=6
res = ++j;    //res = 6 and j=6

編程中哪一個最常用?

兩者都可以根據您的需要使用,也可以根據您的需要使用。


還有一點需要注意: ++i是l值,但i++不是。 詳情請見此處

你的分析是正確的。 i++返回的值i ,然后增加,而++i將遞增的價值i ,然后返回新值。 i += 1將與++i相同。 它們在實際代碼中的使用位置差異主要是情境; 關於每個人最常使用或有幫助的地方,沒有具體的答案。 這一切都取決於你想做什么。

這是一個人為的例子,一次使用后增量( i++形式)可能有用:

// Return the length of a string, including the null byte
int stringLength(char str[])
{
    int length = 0;
    while (str[length++] != 0);
    return length;
}

如果要返回沒有空字節的長度,可以使用++i表單稍微修改上面的示例:

// Return the length of a string, without the null byte
int stringLength(char str[])
{
    int length = -1;
    while (str[++length] != 0);
    return length;
}

至於i += 1 ,我認為我沒有做過那么多,因為你可以使用預增量或后增量。 我通常只將復合賦值運算符用於1以外的值。

我想如果您想象for循環如何工作,您可以理解手頭的問題。

for循環

initialization    --> i = 0

<check condition>  --> i<10? ------->--------------------
 |                      |                                |
 ^                      |yes(i.e condition not met)      |no(i.e condition met)
 |                      V                                V
 |                  --------------
 |                  |body of loop|
 |                  --------------
 |                      |
 |                      V
 -------<------------increment i (**)                exit for loop

** increment i表示i++++i

i++可以替換為:

int temp = i;
i = i + 1;

temp在這里沒用,所以編譯器會將它優化為inc i指令。 即使它沒有那么temp也只是浪費空間而已。

++我可以被替換

i = i + 1;
int temp = i; 

再次temp不是必需的,所以編譯器只需用inc i指令替換它。

如果你看到兩條指令都是相同的,因為它們沒有被分配給任何東西。 只有i受到增量的影響。 所以兩者基本相同。 如果i是內置類型,這是真的。

你看到增量指令放在循環體之后? 你現在能看到這幾乎與你展示的while循環相似嗎?

以這種方式思考循環總是很好的。

暫無
暫無

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

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