這是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.
如何理解這個呢?
這是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.
如何理解這個呢?
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
的值相同。
解決方案的意思是說,有是沒有什麼區別,++i
具有相同的含義(i += 1)
不管i
恰好是不管表達的情況下。圍繞i += 1
的括號確保即使上下文包含進一步的算術運算,例如++i * 3
等於(i += 1) * 3
,但不等於(相當於i += 3
),等值仍然成立。
相同並不適用於i++
,其具有相同的副作用(遞增i
),但在周圍的表達不同的值 - 的i
遞增前的值。
但是'i ++ + 1'總是等於'++ i'和'i + = 1'。 :-) –
運營商簽名是相同的。他們都返回例如INT和。 – user2672165
@ user2672165:在C中沒有'int&'這樣的東西。 –
++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 */
問題標記爲「C」,而不是「C++」。 – BatchyX
而這個問題不涉及後增量。 –
更重要的是,在這個答案中的「之前」和「之後」這兩個單詞並不反映C中前後遞增的現實(也可能不是C++中的)。 'i ++'在最後一個序列點和下一個序列點之間的任何時候評估爲'i'的最後一個值並增加'i',並且程序不允許觀察何時。 –
我認爲它們完全一樣。有一件事可能很有趣。 ++ i等於(i + = 1),但不等於i + = 1;不同之處在於大括號。因爲i + = 1可能取決於上下文,它會有不同的解釋。
在正常操作中不分配:
++ 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時使用i ++/++ i。
通常,i + =僅在增量爲對於正常增量使用它不會是危險的,但會導致理解上的輕微碰撞,並使代碼看起來很不尋常。二者之間
區別是: ++是一元運算符而+是一個二進制運算符.... 如果我們考慮執行時間:i++ is more faster than i=i+1.
否機器週期的不同來執行相同的一組代碼這就是++運算符總是首選循環的原因。 Refer to this thread for more info
你不明白什麼部分? –
假設如果'i = 10',那麼'i + = 1'後'i'變成'11'。 –
你錯了'++ i'≠'i ++',我會舉一個例子。 – phaazon