多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 指針和指針運算符一起時的運算規則(比如*p++和*++p的區別)

指針和指針運算符一起時的運算規則(比如*p++和*++p的區別)

來源:程序員人生   發布時間:2014-10-08 12:11:35 閱讀次數:3989次

接下來,通過示例徹底理解自增運算符的兩種用法(自減的用法與之類似,只不過是加1變成了減1)。

    1、++i和i++的區別

    如清單1(注意代碼中的注釋): 

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     int a, b, i = 7;  
  6.   
  7.     i++; //等價于i = i + 1;  
  8.     ++i; //等價于i = i + 1;  
  9.   
  10.     a = i++; //等價于a = i; i = i + 1;  
  11.     b = ++i; //等價于i = i + 1; b = i;  
  12.       
  13.     printf("a = %d, b = %d ", a, b);  
  14.       
  15.     return 0;  
  16. }  

    例子輸出結果: 

[cpp] view plaincopy
  1. a = 9, b = 11  

    在例子中,第7和第8行的作用一樣,僅僅是為變量i加1,這時i的值已經增加為9,接下來第10行變量a先獲得i的值(即9),然后i加1,第11行變量i先再加1,然后把得到的值賦給b,所以b的值為11。

    稍微復雜的例子,如清單2: 

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     int a = 5;  
  6.   
  7.     int *p = &a;  
  8.   
  9.     int b = (*p)++; //等價于b = a++; 即b = a; a = a + 1;  
  10.   
  11.     int c = ++(*p); //等價于c = ++a; 即a = a + 1; c = a;   
  12.       
  13.     printf("b = %d, c = %d ", b, c);  
  14.   
  15.     printf("(*p)++ = %d, ++(*p) = %d ", (*p)++, ++(*p));  
  16.   
  17.     return 0;  
  18. }  

    例子輸出結果: 

[cpp] view plaincopy
  1. b = 5, c = 7  
  2. (*p)++ = 8, ++(*p) = 8  

    在這個例子中,只不過是通過*p來間接地操作a,其他關于自增運算符的用法與清單1類似。第9行的*p一定要用小括號括起來,否則含義就不一樣了。而第11行的++(*p)也可以寫成++*p(用GCC驗證過),那是因為對操作數p來說它只有一個運算符*在計算它,所以無關乎運算符優先級和結合性的問題。

    值得注意的是,由于C語言沒有指定函數各參數的求值順序,所以第15行的代碼是不可移植的,用不同的編譯器可能會產生不同的結果(對于這個例子,GCC是先計算++(*p),后計算(*p)++,所以兩者都等于8)。

    知識點:

    (1)、副作用

    在對表達式求值的同時,修改了某些變量的值,其中修改值的行為在C語言中被叫作副作用,那是因為對C語言而言,計算的目的就是對表達式求值,如語句int a = 5,它的含義是先求值得到5,然后把5賦值給變量a,后一步的賦值就是此表達式的副作用。自增和自減運算符就是因為副作用而被使用,除了加1或減1之外,還給自身賦值。

    (2)、運算符的優先級

    在C語言中,把運算符的優先級分為15級,如下表,從上到下,依次為從最高優先級到最低優先級(為了方便記憶,將15級分成11類,并對每類進行了命名)。

初等運算符

包括小括號 ()、中括號 [] 、成員訪問運算符 . 和 -> 。

一元運算符

包括自增++和自減--、正負號+ 和-、間接運算*和取址運算& 、類型轉換(type)、 sizeof 、邏輯反! 、位取反~等。

算術運算符

包括兩級,先乘除(*、/、%)后加減(+、-)。

位移運算符

包括左移 << 和右移 >> 。

關系運算符

包括小于 < 、小于等于 <= 、大于 > 、大于等于 >= 。

判等運算符

包括相等 == 和不相等 != 。

位邏輯運算符

分三級,依次為位與 &、位異或 ^ 和位或 | 。

邏輯運算符

分兩級,依次為邏輯與 && 和邏輯或 || 。

條件運算符

? :

賦值運算符

包括= 、+= 、-=、 *=、 /=、 %= 、&= 、^=、 |= 、<<= 、>>= 。

逗號運算符

    (3)、結合性

    對于同一操作數,在具有兩個相同優先級的操作符時決定先執行哪個操作符的問題就是由結合性決定的。

    相同優先級的操作符具有同樣的結合性。右結合性就是說表達式中最右邊的操作最先執行,然后從右到左依次執行。在C語言中,具有右結合性的操作符只有相應的三類,分別為一元運算符、條件運算符和賦值運算符。

    注意:C語言中的優先級和結合性都是針對同一操作數而言的。如表達式24/8*2,對于操作數8而言,/ 和*的優先級相同,所以再根據它們的左結合性可知,表達式是先計算24/8得到3,然后計算3*2得到6。

    C語言并沒有規定同一運算符相關的多個操作數的計算順序(&&、|| 、? : 和 , 運算符除外),如式子a = 8 * 9 + 20 * 4,對操作數9和20而言,根據優先級就可判斷先乘后加,但表達式中的兩個*并不共享同一操作數,所以從左到右的結合性并不適用它,8 * 9 和20 * 4的計算順序是不定的,到底先計算8 * 9還是20 * 4由編譯器決定。

    在上面例子中,8 * 9和20 * 4誰先執行都不影響最后結果的一致,但有些情況下就未必了,如“ b = 3; a = (b++) * (b++); ”這樣的例子,對于不同的編譯器最后a的值可能等于9,也可能等于12,甚至可能等于16。因此,在實際應用中不能出現這樣的未確定性,根據自己的需要,可以把它改成類似“b = 3; c = b++; a = c * c;”這樣的形式。

    2、*p++和*++p的區別

    舉例,如清單3: 

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. 生活不易,碼農辛苦
    如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
    程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成 人 a v免费视频 | 一级毛毛片毛片毛片毛片在线看 | 国产欧美日韩一区二区三区视频 | 欧美日韩国产中文字幕 | 日韩欧美1区 | 日本免费人做人一区在线观看 | 国产在线观看不卡免费高清 | 日本欧美一区 | 久久久久久综合一区中文字幕 | 在线观看亚洲一区 | 欧美亚洲国产精品久久蜜芽 | 激情五月婷婷综合 | 桐谷茉莉在线 | 伊人色在线观看 | 免费v片在线观看 | 日本人69式视频最长 | 俄罗斯18videosex性欧美成人 | 最近中文字幕无吗高清视频 | 欧美激情在线精品video | 欧美视频 亚洲视频 | 欧美成人免费观看国产 | 亚洲精品一二三四区 | 波多野结衣久久一区二区 | 久久精品在线视频 | 五月网站 | 18男女很黄的视频 | 国产福利第一视频 | h网址在线 | 国产亚洲3p一区二区三区 | free性欧美高清vide0s | 69视频在线 | 亚洲色图校园春色 | 国产35页 | 日本成在线人视频免费视频 | 日本特黄特色大片免费视频播放 | 精品偷自拍另类在线观看 | 日本中文字幕视频在线看 | 手机福利在线观看 | 天天视频国产 | 国产精品二区页在线播放 | 偷拍亚洲欧美 |