亚洲香蕉成人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
欧美激情免费在线| 午夜精品一区二区三区在线播放| 日韩福利伦理影院免费| 精品一区二区三区三区| 国产欧美精品va在线观看| 中文字幕欧美视频在线| 欧美激情一区二区久久久| 精品国产一区二区三区四区在线观看| 日本sm极度另类视频| 亚洲激情在线观看视频免费| 日本三级韩国三级久久| 亚洲国产日韩精品在线| 亚洲国产日韩一区| 91久久精品国产91性色| 亚洲一区制服诱惑| 日韩精品福利网站| 久精品免费视频| 亚洲成年人在线| 国产精品久久久久久久久借妻| 国产精品爽爽爽| 两个人的视频www国产精品| 亚洲欧美日韩天堂一区二区| 久久精品99国产精品酒店日本| 久久久影视精品| 日韩欧美在线第一页| 亚洲加勒比久久88色综合| 久久99视频精品| 国产精品亚洲综合天堂夜夜| 欧美激情a∨在线视频播放| 国产中文欧美精品| 日韩成人中文电影| 欧美视频中文在线看| 国产精品久久久久久av福利| 日韩视频中文字幕| 亚洲欧美综合v| 久久精品国产亚洲7777| 欧美日韩高清在线观看| 91美女高潮出水| 高清欧美性猛交| 精品在线欧美视频| 97视频在线播放| 欧美裸体视频网站| 日韩av电影在线免费播放| 在线播放国产一区二区三区| 色无极影院亚洲| 91精品久久久久久久久不口人| 国产精品久久久久一区二区| 国产成人精品综合久久久| 精品av在线播放| 日韩精品在线视频| 亚洲天堂av在线播放| 亚洲第一精品久久忘忧草社区| 亚洲欧洲美洲在线综合| 国产精品va在线播放我和闺蜜| 日韩成人在线电影网| 欧美性xxxx极品高清hd直播| 久热精品视频在线观看| 国产视频在线观看一区二区| 久久精品国亚洲| 日韩精品视频免费| 亚洲人成免费电影| 91精品国产综合久久香蕉最新版| 中文字幕精品视频| 亚洲电影免费观看高清完整版| 美女撒尿一区二区三区| 91免费在线视频| 国产精品直播网红| 日韩国产在线播放| 欧美日韩国产在线播放| 亚洲欧美日韩在线高清直播| 国产精品久久久久久久久久尿| 亚洲精品欧美极品| 亚洲一区二区三区在线免费观看| 日韩高清a**址| 中文字幕一精品亚洲无线一区| 亚洲精品一区二区久| 欧美老女人性视频| 狠狠色香婷婷久久亚洲精品| 中文字幕精品一区二区精品| 成人免费高清完整版在线观看| 久久在精品线影院精品国产| 国产日韩欧美自拍| 亚洲欧美在线看| 日韩欧美国产骚| 91高清在线免费观看| 97国产真实伦对白精彩视频8| 国产精品人成电影在线观看| 亚洲91精品在线| 国产在线98福利播放视频| 国产欧美最新羞羞视频在线观看| 亚洲天堂av在线免费观看| 日韩欧美福利视频| 91精品久久久久久久久| 精品在线欧美视频| 国产欧美精品日韩| 欧美午夜激情视频| 国产偷国产偷亚洲清高网站| 日韩黄色在线免费观看| 欧美野外wwwxxx| 91国内揄拍国内精品对白| 日韩精品视频在线免费观看| 清纯唯美日韩制服另类| 亚洲午夜国产成人av电影男同| 国产精品视频免费观看www| 国产在线观看精品| 欧美老少做受xxxx高潮| 精品一区二区三区四区在线| 欧美大片免费看| 久久久999精品| 国产成人黄色av| 日韩成人激情在线| 欧美日韩在线视频观看| 国产乱人伦真实精品视频| 久久99热这里只有精品国产| 欧美电影免费观看高清| 在线播放日韩av| 国产精品99久久久久久白浆小说| 一区二区福利视频| 高清欧美性猛交xxxx黑人猛交| 亚洲va国产va天堂va久久| 日韩精品视频在线观看网址| 国精产品一区一区三区有限在线| 亚洲国产精品国自产拍av秋霞| 亚洲最大的网站| 国模精品一区二区三区色天香| 在线播放国产精品| 日本乱人伦a精品| 日韩激情av在线播放| 久久久女女女女999久久| 91av在线视频观看| 欧美极品少妇xxxxⅹ裸体艺术| 欧美超级免费视 在线| 国产欧美亚洲精品| 欧美日韩国产第一页| 国产成人中文字幕| 久久视频在线观看免费| 亚洲人成电影在线播放| 国产成人一区二区三区电影| 日韩精品一区二区三区第95| 91九色单男在线观看| 亚洲欧美日韩爽爽影院| 欧美成人第一页| 日韩电影第一页| 亚洲四色影视在线观看| 日韩av在线网址| 国产日韩精品一区二区| 久久91亚洲精品中文字幕奶水| 国产精品pans私拍| 日本成人精品在线| 亚洲欧洲在线观看| 日韩网站免费观看高清| 亚洲欧美日韩一区在线| 欧美黑人xxxⅹ高潮交| 国产精品吹潮在线观看| 欧美午夜片在线免费观看| 成人av.网址在线网站| 欧美视频在线观看免费| 欧美日韩国产成人在线| 97国产精品人人爽人人做| 欧美在线www| 欧美高清第一页| 国产精品高潮呻吟久久av黑人| 91成人性视频| 亚洲福利视频二区|