不要再問
i++,
++i啦!
好多人面試的喜歡問
i++和
++i的區別。尤其是對應屆畢業生面試中尤為常見。更有主考官原意出「
x = 4; x = (4 + x++) + ( ++x )」這種難題,覺得這種題可以綜合考察被面試者的綜合能力。不排除有人,能把這種題答的很完美,但也不排除有的主考官連自己都搞不明白。
先不說這題出的對錯,這種問題,在大部分(覺大部分)開發中又有多少機會會被使用到??
接著我說這種的出的是否合理。
首先介紹兩個我在下面會提到的術語:
***(
side effect):指的是在計算表示式時對某些東西(如儲存變數中的值)進行修改。
順序點(
sequence point):是指程式執行過程中的乙個點,在這裡,進入一步之前將確保對所有的***都進行了評估。在
c++中,語句的分號就是乙個順序點,這意味著程式處理下一條語句之前,賦值操作符、遞迴操作符和遞減操作符執行的所有修改必須完成。
何為乙個完整的表示式呢?例子有:表示式語句中的表示式部分以及用作
while迴圈中檢測條件的表示式。
順序點有助闡明字尾遞增何時進行。
現在來看下面語句:
y = (4 + x++) + (6 + x++);
表示式4 + x++ 不是乙個完整的表示式,因此,
c++不能保證
x的值計算子表示式
4 + x++後立刻增加
1。在這個例子中整條賦值語句是乙個完整的表示式,而分號表示裡順序點,因此
c++ 只能保證程式執行大下一條語句之前,
x的值增加兩次。
c++沒有規定是在計算每個表示式之後將
x的值遞增,還是在表示式計算完畢後才將
x的值遞增,有鑑於此,您應避免使用這樣的表示式。
上面這種情況指的是
iso/ansi c++標準第二版(
iso/iec 14882:2003)。但是不同的
c++編譯器廠商在此基礎上的標準也不同,應該說都是對這種標準的繼承。
所以說這是一道毫無意義的題。
關於i 與 i的思考
筆者剛接觸這個的時候,也是糊里糊塗,特意去查詢了許多資料,自以為已經了解,不想仍是只在此山中,雲深不知處。通常的解釋是 i 先運算,再自增 i先自增,再運算。一定程度上,這兩句話是對的。但筆者這裡想說的是,筆者贊同第二句話,卻不認可第一句話。我們來看乙個簡單的例子 int i 0 int b 0 b...
關於 i 快於 i
當然,很多時候我們有的 用c 提交通過了,但是g 卻失敗了呢?眾所周知,不同的編譯器,會對 做出一些不同的優化。舉乙個最簡單的例子。針對單個語句 注意,是單個語句,不是包含在語句中的那種前 和後 a a b a 一般的講,我們都知道,這兩條語句的最終結果是一樣的,就是a自己增加了1。但是,兩者的差距...
關於 i 和 i 的區別
i 和 i 的使用分為兩種情況 1 單獨使用 2 放入表示式中使用。1 第一種情況,單獨使用時從實現的效果 即程式的執行結果 上看是等價的。2 當放入表示式中使用,則有本質區別 b i 字首形式,等價於 i i 1 b i b i 字尾形式,等價於 b i i i 1 i 是先使用後自加,在結束標誌...