C語言入門教程之二運算符

無論是加減乘除還是大於小於,都需要用到運算符,在C語言中的運算符和我們平時用的基本上都差不多。
運算符包括賦值運算符、算術運算符、邏輯運算符、位邏輯運算符、位移運算符、關係運算符、自增自減運算符。大多數運算符都是二目運算符,即運算符位於兩個表達式之間。單目運算符的意思是運算符作用於單個表達式。(具體什麼是表達式下一節再說)

一、賦值運算符
    賦值語句的作用是把某個常量或變量或表達式的值賦值給另一個變量。符號爲‘=’。這裏並不是等於的意思,只是賦值,等於用‘==’表示。
    注意:賦值語句左邊的變量在程序的其他地方必須要聲明。
    得已賦值的變量我們稱爲左值,因爲它們出現在賦值語句的左邊;產生值的表達式我們稱爲右值,因爲她它們出現在賦值語句的右邊。常數只能作爲右值。
    例如:
        count=5;
        total1=total2=0;
    第一個賦值語句大家都能理解。    
    第二個賦值語句的意思是把0同時賦值給兩個變量。這是因爲賦值語句是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然後total1=total2;那麼我們這樣行不行呢?
        (total1=total2)=0;
    這樣是不可以的,因爲先要算括號裏面的,這時total1=total2是一個表達式,而賦值語句的左邊是不允許表達式存在的。

二、算術運算符
    在C語言中有兩個單目和五個雙目運算符。
       符號   功能
        +   單目正
        -   單目負
        *   乘法
        /   除法
        %   取模
        +   加法
        -   減法
    下面是一些賦值語句的例子, 在賦值運算符右側的表達式中就使用了上面的算術運算符:
        Area=Height*Width;
        num=num1+num2/num3-num4;
    運算符也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。
    取模運算符(%)用於計算兩個整數相除所得的餘數。例如:
        a=7%4;
    最終a的結果是3,因爲7%4的餘數是3。
    那麼有人要問了,我要想求它們的商怎麼辦呢?
        b=7/4;
    這樣b就是它們的商了,應該是1。
    也許有人就不明白了,7/4應該是1.75,怎麼會是1呢?這裏需要說明的是,當兩個整數相除時,所得到的結果仍然是整數,沒有小數部分。要想也得到小數部分,可以這樣寫7.0/4或者7/4.0,也即把其中一個數變爲非整數。
    那麼怎樣由一個實數得到它的整數部分呢?這就需要用強制類型轉換了。例如:
        a=(int) (7.0/4);
    因爲7.0/4的值爲1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。那麼思考一下a=(float) (7/4);最終a的結果是多少?
    單目減運算符相當於取相反值,若是正值就變爲負值,若是負數就變爲正值。
    單目加運算符沒有意義,純粹是和單目減構成一對用的。

三、邏輯運算符
    邏輯運算符是根據表達式的值來返回真值或是假值。其實在C語言中沒有所謂的真值和假值,只是認爲非0爲真值,0爲假值。
       符號   功能
        &&    邏輯與
        ||    邏輯或
        !    邏輯非
    例如:
        5!3;
        0||-2&&5;
        !4;

    當表達式進行&&運算時,只要有一個爲假,總的表達式就爲假,只有當所有都爲真時,總的式子才爲真。當表達式進行||運算時,只要有一個爲真,總的值就爲真,只有當所有的都爲假時,總的式子才爲假。邏輯非(!)運算是把相應的變量數據轉換爲相應的真/假值。若原先爲假,則邏輯非以後爲真,若原先爲真,則邏輯非以後爲假。
    還有一點很重要,當一個邏輯表達式的後一部分的取值不會影響整個表達式的值時,後一部分就不會進行運算了。例如:
        a=2,b=1;
        a||b-1;
    因爲a=2,爲真值,所以不管b-1是不是真值,總的表達式一定爲真值,這時後面的表達式就不會再計算了。

四、關係運算符
    關係運算符是對兩個表達式進行比較,返回一個真/假值。
       符號   功能
        >    大於
        <    小於
        >=    大於等於
        <=    小於等於
        ==    等於
        !=    不等於
    這些運算符大家都能明白,主要問題就是等於==和賦值=的區別了。
    一些剛開始學習C語言的人總是對這兩個運算符弄不明白,經常在一些簡單問題上出錯,自己檢查時還找不出來。看下面的代碼:
       if(Amount=123) ……
    很多新人都理解爲如果Amount等於123,就怎麼樣。其實這行代碼的意思是先賦值Amount=123,然後判斷這個表達式是不是真值,因爲結果爲123,是真值,那麼就做後面的。如果想讓當Amount等於123才運行時,應該if(Amount==123) ……

五、自增自減運算符
    這是一類特殊的運算符,自增運算符++和自減運算符--對變量的操作結果是增加1和減少1。例如:
        --Couter;
        Couter--;
        ++Amount;
        Amount++;
    
   看這些例子裏,運算符在前面還是在後面對本身的影響都是一樣的,都是加1或者減1,但是當把他們作爲其他表達式的一部分,兩者就有區別了。運算符放在變量前面,那麼在運算之前,變量先完成自增或自減運算;如果運算符放在後面,那麼自增自減運算是在變量參加表達式的運算後再運算。這樣講可能不太清楚,看下面的例子:
       num1=4;
       num2=8;
       a=++num1;
       b=num2++;
    
   a=++num1;這總的來看是一個賦值,把++num1的值賦給a,因爲自增運算符在變量的前面,所以num1先自增加1變爲5,然後賦值給a,最終a也爲5。b=num2++;這是把num2++的值賦給b,因爲自增運算符在變量的後面,所以先把num2賦值給b,b應該爲8,然後num2自增加1變爲9。
   那麼如果出現這樣的情況我們怎麼處理呢?
        c=num1+++num2;
   到底是c=(num1++)+num2;還是c=num1+(++num2);這要根據編譯器來決定,不同的編譯器可能有不同的結果。所以我們在以後的編程當中,應該儘量避免出現上面複雜的情況。

六、複合賦值運算符
    在賦值運算符當中,還有一類C/C++獨有的複合賦值運算符。它們實際上是一種縮寫形式,使得對變量的改變更爲簡潔。
        Total=Total+3;
    乍一看這行代碼,似乎有問題,這是不可能成立的。其實還是老樣子,&apos;=&apos;是賦值不是等於。它的意思是本身的值加3,然後在賦值給本身。爲了簡化,上面的代碼也可以寫成:
        Total+=3;
    複合賦值運算符有下列這些:
       符號    功能
        +=    加法賦值
        -=    減法賦值
        *=    乘法賦值
        /=    除法賦值
        %=    模運算賦值
        <<=   左移賦值
        >>=   右移賦值
        &=    位邏輯與賦值
        |=    位邏輯或賦值
        ^=    位邏輯異或賦值
    上面的十個複合賦值運算符中,後面五個我們到以後位運算時再說明。    
    那麼看了上面的複合賦值運算符,有人就會問,到底Total=Total+3;與Total+=3;有沒有區別?答案是有的,對於A=A+1,表達式A被計算了兩次,對於複合運算符A+=1,表達式A僅計算了一次。一般的來說,這種區別對於程序的運行沒有多大影響,但是當表達式作爲函數的返回值時,函數就被調用了兩次(以後再說明),而且如果使用普通的賦值運算符,也會加大程序的開銷,使效率降低。

七、條件運算符
    條件運算符(?:)是C語言中唯一的一個三目運算符,它是對第一個表達式作真/假檢測,然後根據結果返回兩外兩個表達式中的一個。
        <表達式1>?<表達式2>:<表達式3>
    在運算中,首先對第一個表達式進行檢驗,如果爲真,則返回表達式2的值;如果爲假,則返回表達式3的值。
    例如:
        a=(b>0)?b:-b;
    當b>0時,a=b;當b不大於0時,a=-b;這就是條件表達式。其實上面的意思就是把b的絕對值賦值給a。

八、逗號運算符
    在C語言中,多個表達式可以用逗號分開,其中用逗號分開的表達式的值分別結算,但整個表達式的值是最後一個表達式的值。
       假設b=2,c=7,d=5,
           a1=(++b,c--,d+3);
           a2=++b,c--,d+3;
   對於第一行代碼,有三個表達式,用逗號分開,所以最終的值應該是最後一個表達式的值,也就是d+3,爲8,所以a=8。對於第二行代碼,那麼也是有三個表達式,這時的三個表達式爲a2=++b、c--、d+3,(這是因爲賦值運算符比逗號運算符優先級高)所以最終表達式的值雖然也爲8,但a2=3。

   還有其他的如位邏輯運算符,位移運算符等等,我們等到講位運算時再說明。

九、優先級和結合性    
    從上面的逗號運算符那個例子可以看出,這些運算符計算時都有一定的順序,就好象先要算乘除後算加減一樣。優先級和結合性是運算符兩個重要的特性,結合性又稱爲計算順序,它決定組成表達式的各個部分是否參與計算以及什麼時候計算。
    下面是C語言中所使用的運算符的優先級和結合性:
     優先級         運算符                結合性
     (最高)        () [] -> .            自左向右
             ! ~ ++ -- + - * & sizeof    自右向左
                    * / %                自左向右
                     + -                 自左向右
                    << >>                自左向右
                  < <= > >=              自左向右
                    == !=                自左向右
                     &                   自左向右
                     ^                   自左向右
                     |                   自左向右
                     &&                  自左向右
                     ||                  自左向右
                     ?:                  自右向左
       = += -= *= /= %= &= ^= |= <<= >>= 自右向左
     (最低)          ,                   自左向右
    在該表中,還有一些運算符我們沒有介紹,如指針運算符、sizeof運算符、數組運算符[]等等,這些在以後的學習中會陸續說明的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章