2017年計算機二級C語言入門教程:運算符

字號:


    第二章 運算符
    無論是加減乘除還是大于小于,都需要用到運算符,在C語言中的運算符和我們平時用的基本上都差不多。
    運算符包括賦值運算符、算術運算符、邏輯運算符、位邏輯運算符、位移運算符、關系運算符、自增自減運算符。大多數運算符都是二目運算符,即運算符位于兩個表達式之間。單目運算符的意思是運算符作用于單個表達式。(具體什么是表達式下一節(jié)再說)
    一、賦值運算符
    賦值語句的作用是把某個常量或變量或表達式的值賦值給另一個變量。符號為‘=’。這里并不是等于的意思,只是賦值,等于用‘==’表示。
    注意:賦值語句左邊的變量在程序的其他地方必須要聲明。
    得已賦值的變量我們稱為左值,因為它們出現在賦值語句的左邊;產生值的表達式我們稱為右值,因為她它們出現在賦值語句的右邊。常數只能作為右值。
    例如:
    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,也即把其中一個數變?yōu)榉钦麛怠?BR>    那么怎樣由一個實數得到它的整數部分呢?這就需要用強制類型轉換了。例如:
    a=(int) (7.0/4);
    因為7.0/4的值為1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。那么思考一下a=(float) (7/4);最終a的結果是多少?
    單目減運算符相當于取相反值,若是正值就變?yōu)樨撝?,若是負數就變?yōu)檎怠?BR>    單目加運算符沒有意義,純粹是和單目減構成一對用的。
    三、邏輯運算符
    邏輯運算符是根據表達式的值來返回真值或是假值。其實在C語言中沒有所謂的真值和假值,只是認為非0為真值,0為假值。
    符號 功能
    && 邏輯與
    || 邏輯或
    ! 邏輯非
    例如:
    5!3;
    0||-2&&5;
    !4;
    當表達式進行&&運算時,只要有一個為假,總的表達式就為假,只有當所有都為真時,總的式子才為真。當表達式進行||運算時,只要有一個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。邏輯非(!)運算是把相應的變量數據轉換為相應的真/假值。若原先為假,則邏輯非以后為真,若原先為真,則邏輯非以后為假。
    還有一點很重要,當一個邏輯表達式的后一部分的取值不會影響整個表達式的值時,后一部分就不會進行運算了。例如:
    a=2,b=1;
    a||b-1;
    因為a=2,為真值,所以不管b-1是不是真值,總的表達式一定為真值,這時后面的表達式就不會再計算了。
    四、關系運算符
    關系運算符是對兩個表達式進行比較,返回一個真/假值。
    符號 功能
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于
    == 等于
    != 不等于
    這些運算符大家都能明白,主要問題就是等于==和賦值=的區(qū)別了。
    一些剛開始學習C語言的人總是對這兩個運算符弄不明白,經常在一些簡單問題上出錯,自己檢查時還找不出來。看下面的代碼:
    if(Amount=123) ……
    很多新人都理解為如果Amount等于123,就怎么樣。其實這行代碼的意思是先賦值Amount=123,然后判斷這個表達式是不是真值,因為結果為123,是真值,那么就做后面的。如果想讓當Amount等于123才運行時,應該if(Amount==123) ……
    五、自增自減運算符
    這是一類特殊的運算符,自增運算符++和自減運算符--對變量的操作結果是增加1和減少1。例如:
    --Couter;
    Couter--;
    ++Amount;
    Amount++;
    看這些例子里,運算符在前面還是在后面對本身的影響都是一樣的,都是加1或者減1,但是當把他們作為其他表達式的一部分,兩者就有區(qū)別了。運算符放在變量前面,那么在運算之前,變量先完成自增或自減運算;如果運算符放在后面,那么自增自減運算是在變量參加表達式的運算后再運算。這樣講可能不太清楚,看下面的例子:
    num1=4;
    num2=8;
    a=++num1;
    b=num2++;
    a=++num1;這總的來看是一個賦值,把++num1的值賦給a,因為自增運算符在變量的前面,所以num1先自增加1變?yōu)?,然后賦值給a,最終a也為5。b=num2++;這是把num2++的值賦給b,因為自增運算符在變量的后面,所以先把num2賦值給b,b應該為8,然后num2自增加1變?yōu)?。
    那么如果出現這樣的情況我們怎么處理呢?
    c=num1+++num2;
    到底是c=(num1++)+num2;還是c=num1+(++num2);這要根據編譯器來決定,不同的編譯器可能有不同的結果。所以我們在以后的編程當中,應該盡量避免出現上面復雜的情況。