2010-11-19 33 views
2

如果我有這樣的代碼:return stack [ - stp]; - 哪一個先發生? stp遞減還是返回元素?

int pop() 
{ 
    return stack[--stp]; 
} 

我知道它是做兩件事情。它返回元素'stp'中一維數組'stack'中包含的值。它也在遞減'stp'。

但是,這種情況發生在哪個順序?

它是否返回元素stp的值,然後遞減stp

或者它是否遞減stp,然後返回由遞減的stp引用的元素的值?

如果代碼:

int top() 
{ 
    return stack[stp-1]; 
} 

它的工作有什麼不同?

我的歉意,我知道這是很常見的編碼風格 - 我仍然有一些麻煩,使得簡潔,沒有註釋的代碼感 - 甚至像這樣的基礎知識。抱歉。

+0

如果你的語法不是很清楚,我建議不要使用它,因爲它會讓閱讀你自己的代碼更加困難。 – 2010-11-19 15:19:44

回答

7

它將遞減stp,然後從新的stp值的位置返回數組中的值。

--stp是一個「前綴遞減」,它被定義爲遞減參數(stp),然後返回新的值。它有一個對應的被稱爲「後綴減量」,stp--,其減小stp,然後返回價值 - 所以stack[stp--]會給你的價值目前stp偏移,但還是遞減stp

最後,您的stack[stp-1]版本將返回與stack[--stp]相同的地方的值,但stp本身將保持不變。

+0

這是非常非常有用的 - 謝謝:) – Eilidh 2010-11-19 15:01:49

+2

「然後」意味着不保證的順序。然後'--stp'的值是遞減值,副作用會將該值存儲回'stp',但副作用不必在表達式中使用該值之前完成,它只具有由下一個序列點完成。 (在這種情況下,沒有可觀察到的差異,但通常可能有差異。) – 2010-11-19 15:06:43

+0

有效點。是否值得編輯答案閱讀「...定義爲返回新的,遞減值,同時將其存儲在'stp'」中,還是小於足以留下注釋的區別? – Chowlett 2010-11-19 16:17:33

2

簡單的答案:首先遞減,然後是數組訪問。

更復雜的答案:此代碼使用前綴遞減運算符,它是預先遞減的。這意味着運營商的結果值是執行遞減後的值

將此與後減量運算符進行對比。 return stack[stp--];也會減少stp,但使用的索引將是初始值。

由於複雜的技術原因允許編譯器有最大限度的自由優化,所以stp被修改時沒有準確定義。但是,當然定義的是用作數組索引的值是stp一旦遞減後的值。

您的top()的代碼根本不會修改stp,但它用作數組索引的值比初始值stp小1。因此,如果您撥打top(),您獲得的價值與您在下次撥打pop()時獲得的價值相同。

+0

方括號中的位是否總是在返回之前先完成? – Eilidh 2010-11-19 15:00:40

+0

@ SG3:在返回之前計算其值,因爲需要計算返回值。副作用有點複雜,「stp」的修改是一個副作用,但是'stp'本身不用於數組查找,只用[]中的表達式的值。基本上,C++標準沒有說明「做」一個表達意味着什麼 - 它說明結果是什麼,它說什麼是副作用,並且它說副作用發生在「先前」序列之後點,並在「下一個」序列點之前。 – 2010-11-19 15:03:08

+0

這裏有很多更多的信息:http://stackoverflow.com/questions/4176328/faq-undefined-behavior-and-sequence-points。這種簡單的情況並不需要,只是爲了解釋爲什麼一個簡單的規則(如「stp」被首先修改)並不總是正確的。 – 2010-11-19 15:09:52

1
  • --stp =預遞減。 stp在使用之前遞減。
  • stp-- =後遞減。在使用它之後,stp遞減。
0

有兩種類型的增量/減量操作:前綴和後綴。 使用前綴運算符時,首先執行該操作,然後進行訪問。在postfix中,第一個是訪問,第二個是操作。

所以,在:

--stp; 

STP將遞減,然後訪問。

0

如果代碼是return stack[stp-1],它的工作方式不同,即stp未被修改。

0

指令return stack[--stp];作品詮釋,他的方式如下:

  • 要返回評估
  • 評價的結果返回

因此表達時,stp值遞減。 至於你之外的其他問題,那就是如果

return stack[--stp];

相當於

return stack[stp-1];

依賴的stp性質。如果它是自動變量,則stp的更改不起作用。

1

減量(也是增量)運算符有兩個版本,例如--i和i--。如果你認爲它們是函數(它們是),代碼將會是(假設你知道什麼是操作符重載,否則,請參閱HERE)。

// --i 
int operator--() { 
    *this = *this - 1; 
    return *this; 
} 

// i-- 
int operator--(int i) { 
    int retVal = *this; 
    *this = *this - 1; 
    return retVal; 
} 

所以,點的存在:

我 - 返回前值遞減

--i返回值遞減


至於

AFTER
int top() { return stack[stp-1]; } 

這將返回一個小於stp的索引。但是,因爲您尚未爲stp分配新值,所以在完成後stp將會是相同的值(這可能不是您想要的值)。

1

return expression;表示「評估表達式並將結果返回給調用者」。函數返回給調用者後,不能再有其他任何事情發生。首先返回給調用者,然後引起一些副作用是不可能的。

即使你寫了return i++;什麼的,它仍然意味着「評估表達式i++,然後返回結果給調用者」。恰巧i++的結果是i在增加之前的值,但仍然,i遞增。簡單地將i++視爲(++i - 1)