亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-01-26 15:47:25
字體:
來源:轉載
供稿:網友

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

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

為了保證程序執行具有確定性的結果,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已經發生,在它之后的所有side effect仍未開始,而兩個Sequence Point之間所有的表達式或者代碼執行的順序是未定義的!

而C++標準又進一步規定了Sequence Point出現的5種情況:

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

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按什么順序發生不一定,但必定在這些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求值結束才繼續求表達式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]末尾也是。

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本最新高清不卡中文字幕| 日韩精品免费在线| 国产精品三级美女白浆呻吟| 91精品久久久久久久久| 成人激情视频在线| 亚洲视频axxx| 中文字幕av一区二区| 欧美裸体xxxx极品少妇| 精品日韩视频在线观看| 国产精品va在线播放我和闺蜜| 欧美老女人bb| 欧美精品在线观看| 日韩精品日韩在线观看| 午夜精品一区二区三区在线| 91日本在线视频| 国产一区二区av| 国产精品草莓在线免费观看| 亚洲性生活视频| 日韩av手机在线看| 欧美精品在线看| 91精品久久久久久久久| 国产在线一区二区三区| 国产精品一二三在线| 久久深夜福利免费观看| 久青草国产97香蕉在线视频| 日韩在线欧美在线| 亚洲欧美精品一区二区| 欧美劲爆第一页| 成人性教育视频在线观看| 久久成人国产精品| 亚洲色图25p| 亚洲图片欧美日产| 亚洲欧美中文日韩在线v日本| 久久久久久久一| 午夜精品一区二区三区在线播放| 成人av电影天堂| 久久91精品国产91久久跳| 91久久久久久国产精品| 国内精品400部情侣激情| 国产日韩欧美视频在线| 欧美在线观看www| 欧美激情videoshd| 在线日韩欧美视频| 97视频在线看| 日韩一区二区在线视频| www国产精品视频| 久久久精品美女| 国产精品老女人精品视频| 久久精品一偷一偷国产| 成人欧美一区二区三区在线湿哒哒| 精品福利在线观看| 欧美黄色片在线观看| 亚洲综合中文字幕在线观看| 国语自产精品视频在线看一大j8| 一本色道久久88综合日韩精品| 97av在线视频| 国产亚洲精品91在线| 国产成人高潮免费观看精品| 日本不卡视频在线播放| 久久99精品久久久久久青青91| 亚洲3p在线观看| 亚洲第一页中文字幕| 97精品国产91久久久久久| 亚洲人精选亚洲人成在线| 亚洲成人久久一区| 精品国产一区二区三区久久久| 成人福利网站在线观看11| 久久亚洲国产精品成人av秋霞| 精品国偷自产在线视频99| 精品国产1区2区| 国产精品久久久久福利| 欧美xxxx18国产| 亚洲人免费视频| 亚洲精品自拍第一页| 亚洲欧美自拍一区| 日韩免费黄色av| 68精品国产免费久久久久久婷婷| 夜夜嗨av一区二区三区免费区| 日韩在线视频播放| 国产精品揄拍一区二区| 国产综合香蕉五月婷在线| 久久久免费高清电视剧观看| 91禁国产网站| 亚洲欧美制服另类日韩| 欧美成人黑人xx视频免费观看| 精品视频在线播放色网色视频| 欧美肥婆姓交大片| 亚洲一区亚洲二区| 久久精品国产一区二区电影| 日韩高清免费在线| 久久伊人精品一区二区三区| 国产视频亚洲视频| 亲爱的老师9免费观看全集电视剧| 91视频免费在线| 日韩av在线看| 日韩电影免费观看在线观看| 欧美精品手机在线| 中文字幕日韩欧美| 亚洲精品白浆高清久久久久久| 夜夜嗨av色一区二区不卡| 亚洲娇小xxxx欧美娇小| 久久国产视频网站| 国产精品视频1区| 国产日韩欧美电影在线观看| 久久精品99国产精品酒店日本| 91最新在线免费观看| 欧美xxxx14xxxxx性爽| 亚洲国产97在线精品一区| 亚洲成人免费网站| 欧美国产激情18| 一区二区三区在线播放欧美| 国产国语刺激对白av不卡| 亚洲系列中文字幕| 最近中文字幕2019免费| 精品国产91久久久久久| 日韩亚洲欧美中文高清在线| 亚洲精品白浆高清久久久久久| 91精品国产综合久久久久久久久| 国内精品久久久久影院 日本资源| 热门国产精品亚洲第一区在线| 日韩精品在线第一页| 日韩高清a**址| 都市激情亚洲色图| 国产精品久久97| 丁香五六月婷婷久久激情| 在线观看精品国产视频| 中文字幕欧美专区| 中文字幕日韩av电影| 亚洲精品久久久久久久久久久久| 亚洲精品成人久久| 国内精品久久久久久| 亚洲欧美色图片| 国产精品久久久久久久久久免费| 亚洲成人精品视频在线观看| 精品久久久久久久久中文字幕| 97精品视频在线| 欧美色欧美亚洲高清在线视频| 日本亚洲欧美成人| 亚洲性69xxxbbb| 国产精品久久久久久久久久| 色婷婷综合久久久久| 久久精品亚洲精品| 国产日本欧美一区二区三区在线| 欧美一区二区三区精品电影| 久久精品视频在线播放| 宅男66日本亚洲欧美视频| 欧美富婆性猛交| 日本久久久久久| 久久久久久18| 欧美精品激情在线| 国产ts一区二区| 九色精品免费永久在线| 萌白酱国产一区二区| 欧美激情久久久久久| 在线观看久久久久久| 国产www精品| 黄色成人在线播放| 91丨九色丨国产在线| 亚洲色图av在线| 亚洲福利小视频| 成人日韩在线电影| 欧美影院久久久| 91亚洲人电影| 国产成人精品一区二区三区|