關於i 與 i 的問題

2021-04-15 11:57:54 字數 1056 閱讀 7510

不要再問

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 是先使用後自加,在結束標誌...