欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于C/C++中的side effect(負效應)和sequence point(序列點)

 更新時間:2013年10月03日 09:55:07   作者:  
不知你在寫code時是否遇到這樣的問題?int i = 3; int x = (++i) + (++i) + (++i); 問x值為多少?進行各種理論分析,并在編譯器上實踐,然而可能發(fā)現(xiàn)最終的結果是不正確的,也是不穩(wěn)定的,不同的編譯器可能會產生不同的結果。這讓人很頭疼

不知你在寫code時是否遇到這樣的問題?int i = 3; int x = (++i) + (++i) + (++i); 問x值為多少?進行各種理論分析,并在編譯器上實踐,然而可能發(fā)現(xiàn)最終的結果是不正確的,也是不穩(wěn)定的,不同的編譯器可能會產生不同的結果。這讓人很頭疼。結果到底是啥呢?對于此題的答案,一句話,Theresult is undefined! 詳細解釋待我慢慢說來。

大家知道,通常而言,我們寫的計算機程序都是從上到下,從左到右依次執(zhí)行。然而,我只是說通常,因為在編譯的過程中,compiler并不僅僅是把source code翻譯成binary code就算了,這個過程里面可能還會對代碼進行優(yōu)化,這種優(yōu)化可能帶來的結果是:代碼或者表達式evaluation的順序可能發(fā)生變化。這可是一個非常嚴重的問題,當某個表達式帶有side-effect(比如改變了一個變量的值),那么它的執(zhí)行順序直接影響到了程序執(zhí)行的結果。

為了保證程序執(zhí)行具有確定性的結果,C++標準引入Sequence Point這個概念,按照ISO/IEC的定義:

At certain specified points in the execution sequence called sequence points. All side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place.

簡而言之,Sequence Point就是這么一個位置,在它之前所有的side effect已經發(fā)生,在它之后的所有side effect仍未開始,而兩個Sequence Point之間所有的表達式或者代碼執(zhí)行的順序是未定義的!

而C++標準又進一步規(guī)定了Sequence Point出現(xiàn)的5種情況:

1、At the end of a full expression
在一個完整的表達式末尾是Sequence Point,所謂完整的表達式是指這個表達式不是另外一個表達式的一部分。所以如果有f(); g();這樣兩條語句,f()和g()是兩個完整的表達式,f()的Side Effect必定在g()之前發(fā)生。

2、After the evaluation of all function arguments in a function call and before execution of any expressions in the function body
調用一個函數時,在所有準備工作做完之后、函數調用開始之前是Sequence Point。比如調用foo(f(), g())時,foo、f()、g()這三個表達式哪個先求值哪個后求值是Unspecified,但是必須都求值完了才能做最后的函數調用,所以f()和g()的Side Effect按什么順序發(fā)生不一定,但必定在這些Side Effect全部作用完之后才開始調用foo函數。

3、After copying of a returned value and before execution of any expressions outside the function
函數即將返回時是Sequence Point,因為函數返回時必然會結束掉一個完整的表達式。

4、After evaluation of the first expression in a&&b,  a||b,  a?b:c,  or  a,b
條件運算符?:、逗號運算符、邏輯與&&、邏輯或||的第一個操作數求值之后是Sequence Point。如條件運算符和逗號運算符,條件運算符要根據表達式1的值是否為真決定下一步求表達式2還是表達式3的值,如果決定求表達式2的值,表達式3就不會被求值了,反之也一樣,逗號運算符也是這樣,表達式1求值結束才繼續(xù)求表達式2的值。

5、After the initialization of each base and member in the constructor initialization list
在一個完整的聲明末尾是Sequence Point,所謂完整的聲明是指這個聲明不是另外一個聲明的一部分。比如聲明int a[10], b[20];,在a[10]末尾是Sequence Point,在b[20]末尾也是。

經過以上說明,大家已有所了解,現(xiàn)在回到我們的題目:int x = (++i) + (++i) + (++i); 整個的語句里面,只有1個Sequence Point,也就是語句的結束點,對于右邊表達式的計算順序沒有任何的規(guī)定,顯然,各種編譯器都可以按照他們覺得“舒服”的方式來進行計算,這樣的代碼,如果只要求在特定的平臺或者編譯器運行,那么帶來的可能只是可讀性差的問題,但如果考慮跨平臺或者編譯器的情況,那么就是完完全全的錯誤!

另外,需要特別注意的是,對于賦值號(assignment operator),C++也沒有把它定義成Sequence Point,也就說這樣的語句:buffer[i] = i++;同樣是undefined的,因為,對于等號左右兩邊的表達式運算順序,你并不能有任何的假定。

相關文章

  • C++實踐Time類中的運算符重載參考方法

    C++實踐Time類中的運算符重載參考方法

    今天小編就為大家分享一篇關于C++實踐Time類中的運算符重載參考方法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C語言數據結構與算法時間空間復雜度基礎實踐

    C語言數據結構與算法時間空間復雜度基礎實踐

    這篇文章主要為大家介紹了C語言數據結構與算法中時間空間復雜度的基礎實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • c語言可變參數實現(xiàn)示例

    c語言可變參數實現(xiàn)示例

    這篇文章主要介紹了c語言可變參數實現(xiàn)示例,需要的朋友可以參考下
    2014-04-04
  • Qt編寫地圖之實現(xiàn)經緯度坐標糾偏

    Qt編寫地圖之實現(xiàn)經緯度坐標糾偏

    地圖應用中都涉及到一個問題就是坐標糾偏的問題,這個問題的是因為根據地方規(guī)則保密性要求不允許地圖廠商使用標準的GPS坐標,而是要用國家定義的偏移標準。本文將詳細講解如何在Qt中實現(xiàn)經緯度坐標糾偏,需要的可以參考一下
    2022-03-03
  • C++ stack與queue模擬實現(xiàn)詳解

    C++ stack與queue模擬實現(xiàn)詳解

    這篇文章主要給大家介紹了關于c++stack與queue模擬實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧
    2021-08-08
  • VS2019 Nuget找不到包的問題處理

    VS2019 Nuget找不到包的問題處理

    這篇文章主要介紹了VS2019 Nuget找不到包的問題處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C++實現(xiàn)LeetCode(77.Combinations 組合項)

    C++實現(xiàn)LeetCode(77.Combinations 組合項)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(Combinations 組合項),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++中的拷貝構造詳解

    C++中的拷貝構造詳解

    這篇文章主要為大家介紹了C++中的拷貝構造,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 新手socket編程入門詳解指南

    新手socket編程入門詳解指南

    本文,將一步一步引導初學者來學習socket,所有編程思路都結合在socket API里面,以及提供socket的疑問和基礎知識點,同時在最后給出多個例程,下面可以和小編一起學習
    2019-05-05
  • C語言數據結構深入探索順序表

    C語言數據結構深入探索順序表

    順序表,全名順序存儲結構,是線性表的一種,線性表用于存儲邏輯關系為“一對一”的數據,順序表自然也不例外,不僅如此,順序表對數據的物理存儲結構也有要求,跟隨下文來具體了解吧
    2022-03-03

最新評論