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

            兔子的技術(shù)博客

            兔子

               :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

            留言簿(10)

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            轉(zhuǎn)自:http://c.chinaitlab.com/cc/basic/200908/790961.html

            逗號(hào)操作符?C++里有逗號(hào)操作符么?

                不少C++ newbie都會(huì)問(wèn)到這問(wèn)題,大家對(duì)+-*/自然是認(rèn)識(shí)的了,對(duì)其他的%!&|之類(lèi)的也不覺(jué)得陌生,但是逗號(hào)操作符?可能有一半的人會(huì)說(shuō)不清楚它到底是干啥的。

                其實(shí),我們是經(jīng)常會(huì)用到逗號(hào)操作符的,但是并不是所有代碼里出現(xiàn)的逗號(hào)都是逗號(hào)操作符。

                讓我們先從一個(gè)類(lèi)的示例代碼開(kāi)始:

              1:
             2:  class mynum
             3:  {
             4:  public:
             5:      mynum(double ndb,...)
             6:      {
             7:          //init with arguments
             8:      }
             9:  };
            10:  class someclass
            11:  {
            12:      someclass():
            13:          num(3,4)
            14:              ,a(0)
            15:              ,b(0)
            16:              ,c(15)
            17:      {
            18:          int i,j;
            19:          i=1,2; //int x=1,2;
            20:          for(;b<10;++b,--c)
            21:          {
            22:              ++a;
            23:          }
            24:      }
            25:      mynum num;
            26:      int a;
            27:      int b,c;
            28:  };

                在這段代碼里,逗號(hào)在5,13-16,18-20,27行都出現(xiàn)了。

                現(xiàn)在先讓我們來(lái)看看逗號(hào)操作符是啥意思:

                一個(gè)包含逗號(hào)的表達(dá)式首先計(jì)算逗號(hào)左邊的表達(dá)式,然后計(jì)算逗號(hào)右邊的表達(dá)式;整個(gè)表達(dá)式的結(jié)果是逗號(hào)右邊表達(dá)式的值。

                然后我們看看上面的代碼:

                第5行是在mynum類(lèi)的構(gòu)造函數(shù)里出現(xiàn)的逗號(hào),只是用來(lái)區(qū)分開(kāi)第一個(gè)double類(lèi)型的參數(shù)和后面的可變參數(shù)。這是一個(gè)特例,如果在構(gòu)造mynum對(duì)象的時(shí)候,本來(lái)是要傳入3.4作為第一個(gè)參數(shù)的,結(jié)果不小心把小數(shù)點(diǎn)變成了逗號(hào)的話,3.4就變成了兩個(gè)參數(shù)3和4——比如在第13行的情況。類(lèi)似這樣的情況編譯器不會(huì)報(bào)錯(cuò),程序也能運(yùn)行,但是mynum類(lèi)里的成員變量可能就因?yàn)闃?gòu)造函數(shù)傳入的變量值變化而導(dǎo)致程序運(yùn)行結(jié)果完全不一致了。這兩個(gè)逗號(hào)都不是逗號(hào)操作符了。

                第14,15,16行的逗號(hào),也不是逗號(hào)操作符。這三個(gè)逗號(hào)只是用來(lái)間隔構(gòu)造函數(shù)的成員變量初始化列表。

                第18行的int i,j;是大家都很常用的變量聲明的語(yǔ)句,逗號(hào)在這里,也只是起了一個(gè)間隔變量聲明的作用,也不是逗號(hào)運(yùn)算符。

                第19行的逗號(hào),如果不認(rèn)識(shí)逗號(hào)操作符的話,一定會(huì)認(rèn)為這肯定是寫(xiě)錯(cuò)了!其實(shí)這正是逗號(hào)操作符了。讓我們看看,經(jīng)過(guò)i=1,2;這個(gè)語(yǔ)句后,i 的值應(yīng)該是多少呢?按照之前逗號(hào)操作符的定義,我們好像可以很輕松的得出i=2.然而,這個(gè)答案是錯(cuò)的!你在得出錯(cuò)誤答案的時(shí)候,忽略了一個(gè)重要的因素——運(yùn)算符優(yōu)先級(jí)!由于=號(hào)的優(yōu)先級(jí)更高,所以i=1,2;這個(gè)語(yǔ)句相當(dāng)于(i=1),2; ,如果要得到期望的2,我們應(yīng)該這樣來(lái)寫(xiě)i=(1,2);。下面的代碼可以驗(yàn)證這個(gè)說(shuō)法的(注意第3行是無(wú)意義代碼,但是可不是錯(cuò)誤代碼哦?。?br>
             1:  int i,j;
            2:  i=1,2;
            3:  3,4;
            4:  j=(1,2);
            5:  printf("%d\n%d\n",i,j);

                繼續(xù)看第一份代碼里的第20行,這是一個(gè)for循環(huán)代碼。這里的逗號(hào),也是逗號(hào)操作符哦。其實(shí)for循環(huán)也是逗號(hào)操作符經(jīng)常出現(xiàn)的地方哦。for循環(huán)里只能寫(xiě)一個(gè)表達(dá)式,而逗號(hào)表達(dá)式這個(gè)時(shí)候就可以讓你完成兩個(gè)甚至多個(gè)表達(dá)式的計(jì)算。比如“for(;b<10;++b,——c)”,++b和——c就會(huì)在每次循環(huán)中都被執(zhí)行到。

                第27行就無(wú)須多說(shuō)了。也就是一普通的變量聲明語(yǔ)句,這里的逗號(hào)也不是逗號(hào)操作符的。

                總的來(lái)說(shuō),逗號(hào)操作符并不是一個(gè)非常常用的操作符,它只在某些特定的上下文環(huán)境里會(huì)有很好的效果,同時(shí),在編碼中還要非常小心錯(cuò)誤的輸入的逗號(hào)引發(fā)錯(cuò)誤的問(wèn)題。

                比如逗號(hào)和括號(hào)就會(huì)引發(fā)一些潛在問(wèn)題,如果在編碼的時(shí)候一疏忽就會(huì)產(chǎn)生一些難以追查的隱藏bug,只有遵守一些既定的編碼規(guī)范,養(yǎng)成良好嚴(yán)謹(jǐn)?shù)木幋a習(xí)慣,才有助于避免一些諸如此類(lèi)的問(wèn)題出現(xiàn)??纯聪旅娴拇a:
              1:  int myadd(int i,int j,int k)
             2:  {
             3:      return i+j+k;
             4:  }
             5:  int myadd(int i,int j)
             6:  {
             7:      return i+j;
             8:  }
             9:
            10:  int main()
            11:  {
            12:
            13:      for(int x=0;x<9;++x)
            14:      {
            15:          printf("%d",myadd((2,3),4));
            16:      }
            17:  }

                由于在第15行,錯(cuò)誤的添加了括號(hào)(在實(shí)際編碼中這樣的情況太常見(jiàn)了),結(jié)果導(dǎo)致整個(gè)的輸出全錯(cuò)了!因?yàn)椋?,3)這個(gè)逗號(hào)表達(dá)式的返回值是3,所以15行相當(dāng)于是myadd(3,4)了!

                so,一定要記住啦,小心,小心,再小心!^_^

            posted on 2009-09-15 14:32 會(huì)飛的兔子 閱讀(230) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++及開(kāi)發(fā)環(huán)境
            中文字幕精品久久| 国产成人久久精品二区三区| 少妇人妻综合久久中文字幕| 亚洲中文字幕无码久久综合网| 久久青青草原亚洲av无码app| 久久精品人人槡人妻人人玩AV| 精品久久777| 最新久久免费视频| 久久伊人精品青青草原高清| 免费精品久久天干天干| 亚洲国产精品热久久| 久久无码AV一区二区三区| 香港aa三级久久三级| 亚洲精品高清国产一线久久| 亚洲天堂久久精品| 国产麻豆精品久久一二三| 午夜福利91久久福利| 国产成人精品久久亚洲| 久久99精品国产自在现线小黄鸭| 亚洲欧洲中文日韩久久AV乱码| 日本道色综合久久影院| 精品久久久久久国产潘金莲 | 久久免费视频一区| 91精品国产9l久久久久| 中文字幕人妻色偷偷久久| 很黄很污的网站久久mimi色| 99精品国产在热久久| 无码国内精品久久人妻| 精产国品久久一二三产区区别 | 东方aⅴ免费观看久久av| 久久97久久97精品免视看秋霞| 91久久婷婷国产综合精品青草 | 99久久亚洲综合精品成人| 2021少妇久久久久久久久久| 久久久久久无码Av成人影院 | 久久www免费人成精品香蕉| 日韩欧美亚洲综合久久影院d3| 久久综合综合久久狠狠狠97色88| 国产产无码乱码精品久久鸭| 久久夜色精品国产网站| 久久久久亚洲AV成人片|