2013-08-24 99 views
1

這是Kn king的c程序設計中的一個問題:一種現代的方法。我不明白他所提供的解決方案: -從任何角度來看,++ i和i + = 1之間的區別

The expression ++i is equivalent to (i += 1). The value of both expressions is i after 
the increment has been performed. 

如何理解這個呢?

+2

你不明白什麼部分? –

+1

假設如果'i = 10',那麼'i + = 1'後'i'變成'11'。 –

+0

你錯了'++ i'≠'i ++',我會舉一個例子。 – phaazon

回答

6
i = 10 
printf("%d", i++); 

將打印10,其中作爲

printf("%d", ++i); 

將打印11

X = i++可以被認爲是這

X = i 
i = i + 1 

其中作爲X = ++i

i = i + 1 
X = i 

所以,

printf ("%d", ++i); 

是相同

printf ("%d", i += 1); 

但不

printf ("%d", i++); 

雖然這三個陳述中的任何一個的值將相同,但i的值相同。

4

解決方案的意思是說,有沒有什麼區別,++i具有相同的含義(i += 1)不管i恰好是不管表達的情況下。圍繞i += 1的括號確保即使上下文包含進一步的算術運算,例如++i * 3等於(i += 1) * 3,但不等於(相當於i += 3),等值仍然成立。

相同並不適用於i++,其具有相同的副作用(遞增i),但在周圍的表達不同的值 - 的i遞增前的值。

+1

但是'i ++ + 1'總是等於'++ i'和'i + = 1'。 :-) –

+0

運營商簽名是相同的。他們都返回例如INT和。 – user2672165

+1

@ user2672165:在C中沒有'int&'這樣的東西。 –

-1

++i是預增量運算符。在設置和返回值(顯然是i + 1)之前,它會增加i

現在,i++是後增量運算符。在對整個指令進行評估後,它會增加i

實施例:

int i = 0; 
std::cout << ++i << std::endl; /* you get 1 here */ 
std::cout << i++ << std::endl; /* you still get 1 here */ 
std::cout << i << std::endl; /* you get 2 here */ 
+4

問題標記爲「C」,而不是「C++」。 – BatchyX

+2

而這個問題不涉及後增量。 –

+0

更重要的是,在這個答案中的「之前」和「之後」這兩個單詞並不反映C中前後遞增的現實(也可能不是C++中的)。 'i ++'在最後一個序列點和下一個序列點之間的任何時候評估爲'i'的最後一個值並增加'i',並且程序不允許觀察何時。 –

0

我認爲它們完全一樣。有一件事可能很有趣。 ++ i等於(i + = 1),但不等於i + = 1;不同之處在於大括號。因爲i + = 1可能取決於上下文,它會有不同的解釋。

0

在正常操作中不分配:

++ i和i ++

增加可變在1.在僞彙編代碼兩者是:

inc i 

但如果分配值的順序與++有關:

x = i ++

產生:

mov x, i 
inc i 

X = ++ i的

農產品:

inc i 
mov x, i 

在的情況下: I + = 1

就會產生:

add i,1 

但是因爲comp在這種情況下,優化代碼也會產生:

inc i 
1

迄今爲止尚未提出的一個區別是代碼的可讀性。很大一部分循環使用增量1,而常見做法是在移動到下一個元素/使索引增加1時使用i ++/++ i。

通常,i + =僅在增量爲對於正常增量使用它不會是危險的,但會導致理解上的輕微碰撞,並使代碼看起來很不尋常。二者之間

0

區別是: ++是一元運算符而+是一個二進制運算符.... 如果我們考慮執行時間:i++ is more faster than i=i+1. 否機器週期的不同來執行相同的一組代碼這就是++運算符總是首選循環的原因。 Refer to this thread for more info

相關問題