• <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 唐風 閱讀(452) 評論(0)  編輯 收藏 引用 所屬分類: 語言技術
            奇米影视7777久久精品人人爽 | 久久大香萑太香蕉av| 久久久精品波多野结衣| 久久精品国产第一区二区| 一本久久免费视频| 久久er国产精品免费观看2| 99久久成人18免费网站| 国产精品成人久久久| 久久精品国产免费| 久久福利资源国产精品999| 成人综合伊人五月婷久久| 久久天天躁狠狠躁夜夜av浪潮| 亚洲精品午夜国产va久久| 99久久国产综合精品麻豆| 亚洲国产小视频精品久久久三级| 国产精品久久久久jk制服| 久久久噜噜噜久久中文字幕色伊伊| 国产精品99久久久精品无码| 91精品无码久久久久久五月天 | 久久91精品国产91久久麻豆| 中文字幕亚洲综合久久菠萝蜜| 国产精品久久国产精麻豆99网站| 无码任你躁久久久久久| 国产高清美女一级a毛片久久w| 人妻少妇久久中文字幕一区二区| 久久精品国产清自在天天线| 久久九九青青国产精品| 久久精品中文闷骚内射| 伊人久久大香线蕉亚洲五月天| 欧美成a人片免费看久久| 2020最新久久久视精品爱| 精品久久久久久无码专区| 久久香综合精品久久伊人| 亚洲精品tv久久久久久久久| 怡红院日本一道日本久久 | 色欲久久久天天天综合网精品| 久久久久亚洲精品中文字幕| 精品久久人人做人人爽综合| 免费观看久久精彩视频| 青青青青久久精品国产| 国产成人精品久久亚洲|