• <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ù)
            久久综合国产乱子伦精品免费| 麻豆精品久久精品色综合| 久久精品aⅴ无码中文字字幕不卡| 国产99久久久国产精品小说| 国产精品免费福利久久| 国产精品热久久无码av| 亚洲av日韩精品久久久久久a| 国产精品99久久久久久董美香| 亚洲日韩中文无码久久| 国产精品热久久无码av| 久久无码人妻一区二区三区午夜| 亚洲精品国产自在久久| 99国内精品久久久久久久| 久久精品人人做人人爽97 | 亚洲va中文字幕无码久久| 国产精品永久久久久久久久久| 伊人久久大香线蕉综合Av| 久久www免费人成看国产片| 久久精品国产69国产精品亚洲| 亚洲va久久久噜噜噜久久 | 色综合久久久久无码专区| 亚洲国产成人精品91久久久| 99久久精品免费看国产免费| 青青青国产精品国产精品久久久久 | 国产一区二区三区久久精品| 久久亚洲精品国产亚洲老地址| 国产精品99精品久久免费| 久久人做人爽一区二区三区| 婷婷久久综合九色综合绿巨人| 久久这里只有精品视频99| 国产综合精品久久亚洲| 国产午夜精品理论片久久| 精品无码久久久久久久久久| 久久99精品免费一区二区| 久久国产香蕉一区精品| 久久天天躁狠狠躁夜夜av浪潮| 热RE99久久精品国产66热| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久最新精品国产| 久久久久亚洲精品男人的天堂| 久久综合伊人77777麻豆|