• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              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}


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

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


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

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


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

            總結下:
                自加與自減表達式用在函數調用中,是非常容易產生副作用的。它所帶來的便利性比較小,但如果產生了隱蔽的 bug,則很難進行查找和處理,可能花費很多時間和精力。所以,至少在團隊合作進行開發時,看情況適當地禁止這種可能產生副作用的用法,是值得的。

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

            posted on 2009-07-05 12:40 唐風 閱讀(445) 評論(0)  編輯 收藏 引用 所屬分類: 語言技術
            久久99精品久久久久久齐齐| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久免费的精品国产V∧| 精品国产乱码久久久久久浪潮| 国产美女久久久| 免费一级欧美大片久久网| 久久久久亚洲AV成人网人人网站 | 久久99热这里只有精品国产| 久久97久久97精品免视看| 久久久久亚洲精品日久生情 | 久久精品无码一区二区三区免费 | 久久一区二区三区99| 婷婷久久久亚洲欧洲日产国码AV| 日本精品久久久中文字幕| 久久久久久精品免费免费自慰| 精品亚洲综合久久中文字幕| 一级女性全黄久久生活片免费| 久久久久久久99精品免费观看| 久久热这里只有精品在线观看| 欧美日韩中文字幕久久伊人| 新狼窝色AV性久久久久久| 久久夜色撩人精品国产| 亚洲国产精品久久久久| 潮喷大喷水系列无码久久精品| 狠狠综合久久综合88亚洲| 久久夜色精品国产www| 日本三级久久网| 女人香蕉久久**毛片精品| 久久国产热精品波多野结衣AV| 四虎亚洲国产成人久久精品| 国产精品成人精品久久久| 久久91综合国产91久久精品| 久久99精品久久久久婷婷| 久久精品卫校国产小美女| 久久久久久免费视频| 久久99这里只有精品国产| 四虎影视久久久免费| 综合久久一区二区三区| 日韩十八禁一区二区久久| 香蕉99久久国产综合精品宅男自| 久久久久国产亚洲AV麻豆|