天天看點

讀c語言深度剖析 -- ++、--操作符

<b>++</b><b>、--</b><b>操作符 (經常忘記)</b>

先做一道題:

int i =3;

(++i)+(++i)+(++i);

表達式的值為多少?15嗎?16嗎?18嗎?其實對于這種情況,C語言标準并沒有作出規定。

有的編譯器計算出來為18,因為i經過3次自加後變為6,然後3個6相加得18;

而有的編譯器計算出來為16(比如visualc++6.0),

先計算前兩個i的和,這時候i自加兩次,2個i的和為10,然後再加上第三次自加的i得16。

其實這些沒有必要辯論,用到哪個編譯器寫句代碼測試就行。但不會計算出15的結果來的。

<b>++</b><b>、--</b><b>作為字首,我們知道是先自加或自減,然後再做别的運算;</b>

<b>但是作為字尾時,到底什麼時候自加、自減?</b>

假設i=0,看下邊的例子:

       int i=0;

       int pi = (++i)+(++i)+(++i);

       printf("i = %d\n",i);      i = 3

       printf("pi = %d\n\n",pi);  pi = 7   這個跟開篇的例子一樣  注:在vc6下調試的     結果 2+2+3

        i=0;

       int j=(i++,i++,i++);

       printf("i = %d\n",i);    i = 3

       printf("j = %d\n\n",j);   j = 2     <b>最後一次i++</b><b>在分号</b><b>後加的</b><b>   是以加不到j</b><b>上</b>

       i=0;

       int x= (++i,i++,i+10);

       printf("i = %d\n",i);    i = 2   <b>       注意i+10 not i+=10  +=  -= </b><b>同字首</b>

       printf("x = %d\n",x);   x = 12    這個例子跟上邊的那個例子  均為逗号表達式

                                              <b>           </b>i  在<b>遇到每個逗号後</b>,認為本計算機關已經結束,i  這時候自加

       int k=(i++)+(i++)+(i++);

       printf("k = %d\n\n",k); k = 0    i  遇到分号,才認為本計算機關已經結束,i 這時候自加。

       for(i=0;i&lt;10;i++)

   {

     //code

    }              i  與10進行比較之後,認為本計算機關已經結束,i  這時候自加

<b>也就是說字尾運算是在本計算機關計算結束之後再自加或自減。</b><b>c</b><b>語言裡的計算機關大體分為以上3</b><b>類。</b>

<b>再看一道題:</b>

<b></b>

a+++b和下面哪個表達式相當:

a),a++  +b;         b),a+  ++b;

調試:

   int a=0;

   int b=1;

   int c=a+++b;

   printf("a = %d\n",a);    

   printf("b = %d\n",b);    

   printf("c = %d\n",c);  

   a=1 b=1 c=1

<b>解釋         </b>c語言有這樣一個規則:

每一個符号應該包含盡可能多的字元。

也就是說,編譯器将程式分解成符号的方法是,從左到右一個一個字元地讀入,如果該字元可能組成一個符号,

那麼再讀入下一個字元,判斷已經讀入的兩個字元組成的字元串是否可能是一個符号的組成部分;

如果可能,繼續讀入下一個字元,重複上述判斷,

直到讀入的字元組成的字元串已不再可能組成一個有意義的符号。

這個處理的政策被稱為“貪心法”。

需要注意到是,除了字元串與字元常量,符号的中間不能嵌有空白(空格、制表符、換行符等)。

如:==是單個符号,而= =是兩個等号。

按照這個規則可能很輕松的判斷a+++b表達式與a++  +b一緻。

在c++标準裡 一個表達式的 子表達式的求值順序是沒有定義的 要求編譯器實作時自行定義。是以不同的編譯器會給出不同的答案