激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 關于C/C++中的side effect(負效應)和sequence point(序列點)

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

2021-01-04 16:34C語言教程網 C/C++

不知你在寫code時是否遇到這樣的問題?int i = 3; int x = (++i) + (++i) + (++i); 問x值為多少?進行各種理論分析,并在編譯器上實踐,然而可能發現最終的結果是不正確的,也是不穩定的,不同的編譯器可能會產生不同的結果。這讓人很頭

不知你在寫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的,因為,對于等號左右兩邊的表達式運算順序,你并不能有任何的假定。

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 一级α片免费看刺激高潮视频 | 欧美黄色性视频 | 九九热精品在线 | 国产精品爱久久久久久久 | 国产日韩久久久久69影院 | 日韩精品中文字幕在线观看 | 成人一级免费视频 | 成人毛片一区二区三区 | 国产成人精品二区 | 99在线啪| 最新91在线视频 | 黄色免费在线网站 | 国产一区二区国产 | 亚洲精品一区中文字幕 | 国产91久久久久 | 国产亚洲精品yxsp | 欧美另类视频在线 | 久久久精品视频国产 | 国产 日韩 一区 | 爱性久久久久久久 | 一级片久久免费 | 成人在线免费视频观看 | 久久里面有精品 | 91看片在线免费观看 | 国产人妖一区二区 | 免费看一级视频 | 国产精品久久久久久久久久iiiii | 国产一区二区精品在线观看 | 午夜精品成人 | 久久综合久久综合久久 | 激情亚洲网| 毛片在线不卡 | 国产精品亚洲欧美一级在线 | 久久狠狠高潮亚洲精品 | 深夜免费观看视频 | 77成人影院| 欧美三级一级 | 婷婷久久久久久 | 午夜小电影 | 日韩视频区 | 国产在线精品一区二区夜色 |