• <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>

            天秤座的唐風

            總會有一個人需要你的分享~!- 唐風 -

              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é)果,多多少少讓人感覺有點意外。
                我們先看下面這句:

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


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

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


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

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

            PS:
                以上程序在VC2003和VC2008中驗證。

            posted on 2009-07-05 12:40 唐風 閱讀(446) 評論(0)  編輯 收藏 引用 所屬分類: 語言技術(shù)
            99久久精品国产一区二区| 欧美熟妇另类久久久久久不卡| 99久久人妻无码精品系列蜜桃| 久久亚洲美女精品国产精品| 日产精品久久久久久久性色 | 久久99精品国产麻豆宅宅| 久久久久四虎国产精品| 久久精品无码av| 久久成人国产精品免费软件| 大蕉久久伊人中文字幕| 亚洲色欲久久久久综合网| 无码人妻精品一区二区三区久久 | 伊人热热久久原色播放www| 久久久无码精品亚洲日韩按摩| 日本免费一区二区久久人人澡 | 亚洲乱亚洲乱淫久久| 久久久久久国产a免费观看黄色大片| 91精品国产9l久久久久| 香蕉久久永久视频| 97久久精品人人做人人爽| 亚洲精品无码久久千人斩| 久久这里只有精品视频99| 99久久婷婷免费国产综合精品| 久久99热这里只有精品66| 色综合久久中文综合网| 国产成人精品白浆久久69| 伊人久久大香线蕉综合影院首页 | 久久久久波多野结衣高潮| 国产成人无码精品久久久久免费| 亚洲午夜久久久久久久久电影网 | 老司机午夜网站国内精品久久久久久久久| 午夜精品久久久久久毛片| 中文成人无码精品久久久不卡| 国产精品女同一区二区久久| av国内精品久久久久影院| 精品久久久久久成人AV| 久久久久久久久久久久中文字幕| 久久久国产精华液| 久久国语露脸国产精品电影| 性色欲网站人妻丰满中文久久不卡| 99久久做夜夜爱天天做精品|