• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天秤座的唐風(fēng)

            總會有一個(gè)人需要你的分享~!- 唐風(fēng) -

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              13 隨筆 :: 0 文章 :: 69 評論 :: 0 Trackbacks

                先看下面這一段程序:

             1#include "stdafx.h"
             2
             3#include <boost/bind.hpp>
             4#include <vector>
             5#include <string>
             6#include <iostream>
             7#include <list>
             8#include <algorithm>
             9
            10using namespace std;
            11using namespace boost;
            12
            13struct Test
            14{
            15    Test& fun1(int &i) {
            16        cout<<"Function 1 : i = "<<i<<endl;
            17        return *this;
            18    }

            19    Test& fun2(int &i) {
            20        cout<<"Function 2 : i = "<<i<<endl;
            21        return *this;
            22    }

            23    Test& fun3(int i) {
            24        cout<<"Function 3 : i = "<<i<<endl;
            25        
            26        return *this;
            27    }

            28
            29    void fun4(int i, Test& t) {
            30        cout<<"Function 4 : i = "<<i<<endl;
            31    }

            32}
            ;
            33
            34int _tmain(int argc, _TCHAR* argv[])
            35{
            36    
            37    Test a;
            38    int i = 0;
            39
            40    cout<<i<<" "<<i++<<endl;
            41    i = 0;
            42    printf("%d, %d\n", i, i++);
            43
            44    i = 0;
            45    a.fun3(++i).fun3(i++);
            46    i = 0;
            47    a.fun1(++i).fun3(i++);
            48
            49    i = 0;
            50    a.fun4(i, a.fun3(i++));
            51
            52    return 0;
            53}


                這段程序的輸出結(jié)果,多多少少讓人感覺有點(diǎn)意外。
                我們先看下面這句:

            cout<<i<<" "<<i++<<endl;


                按慣常的思維來說,我們認(rèn)為的結(jié)果是第一次輸出 0 ,第二次輸出也是 0 ,之后,變量 i 的值變成 1 。
                但實(shí)際上,第一次輸出了 1 ,第二次輸出的是 0 。
                為什么呢?原來在一個(gè)語句中,如果存在多個(gè)函數(shù)調(diào)用,那么參數(shù)值會從右到左處理一遍,之后再從左到右調(diào)用每個(gè)函數(shù)。從右到左處理參數(shù)是為了滿足 C/C++ 的變參數(shù)函數(shù)的要求,而從左到右的調(diào)用函數(shù)則是與書寫習(xí)慣相符合的。
                那么,這個(gè)語句中,先把 i 的值賦給第二個(gè)輸出流操作符,然后進(jìn)行自加,再將 i 的值(自加之后的)賦給第一個(gè)輸出流操作符。結(jié)果和我們預(yù)想的“正常行為”就不太一樣了。
                其實(shí)同樣的,如果這里不是用輸出流,而用 C 的printf ,比如:

            printf("%d ,%", i , i++)


                在上面的情況下,程序的行為經(jīng)過解釋之后,我們還是能夠理解的。
                第X、Y行的代碼行為,就難以解釋了。(我懷疑這是微軟編譯器的bug,呵呵)
                第 45 行,fun3 得到的是 i 自加前的值,而第 47 行,fun3 得到的則是 i 自加后的值,兩者的區(qū)別只是因?yàn)榍耙粋€(gè)函數(shù)中,i 是值傳遞還是以引用傳遞。這一點(diǎn),只要看下對應(yīng)的匯編代碼就能進(jìn)行驗(yàn)證。

            總結(jié)下:
                自加與自減表達(dá)式用在函數(shù)調(diào)用中,是非常容易產(chǎn)生副作用的。它所帶來的便利性比較小,但如果產(chǎn)生了隱蔽的 bug,則很難進(jìn)行查找和處理,可能花費(fèi)很多時(shí)間和精力。所以,至少在團(tuán)隊(duì)合作進(jìn)行開發(fā)時(shí),看情況適當(dāng)?shù)亟惯@種可能產(chǎn)生副作用的用法,是值得的。

            PS:
                以上程序在VC2003和VC2008中驗(yàn)證。

            posted on 2009-07-05 12:40 唐風(fēng) 閱讀(461) 評論(0)  編輯 收藏 引用 所屬分類: 語言技術(shù)
            久久久久久狠狠丁香| 久久精品国产只有精品2020| 国产精品综合久久第一页| 久久国产成人精品麻豆| 国内精品久久久久久久久电影网 | 色欲综合久久中文字幕网| 久久夜色精品国产噜噜亚洲AV| 久久久无码一区二区三区| 99久久精品国产毛片| 热re99久久6国产精品免费| 久久成人影院精品777| 伊人久久综在合线亚洲2019 | 亚洲色大成网站WWW久久九九| AV无码久久久久不卡网站下载| 久久精品亚洲乱码伦伦中文| 天堂久久天堂AV色综合| 亚洲精品国精品久久99热| 国产精品国色综合久久| 久久无码高潮喷水| 久久综合久久伊人| 91超碰碰碰碰久久久久久综合| 日韩精品久久久肉伦网站 | 东方aⅴ免费观看久久av| 亚洲嫩草影院久久精品| 国产亚洲美女精品久久久2020| 99久久夜色精品国产网站| 国产精品久久久久久福利69堂| 久久综合视频网| 三级片免费观看久久| 国产精品99久久久久久董美香| 高清免费久久午夜精品| 国产午夜福利精品久久2021| 久久久婷婷五月亚洲97号色| 99久久夜色精品国产网站| 国产69精品久久久久APP下载| 精品综合久久久久久88小说 | 国产综合成人久久大片91| 精品久久久久久久久久中文字幕| 精品久久久久久国产牛牛app| 精品无码人妻久久久久久| 亚洲国产成人精品女人久久久 |