C語言運算符和表達式(二)

謹記

當你還在原地停留不動時,你的敵人已經前進一大步了;當你還沉浸在成功的喜悅中,你的對手又更上一層樓了;當你還在失落無助的時候,你的敵人已經站起來繼續向前走了;人生苦短,你需要不斷的前行,不斷的奮斗,如果哪天你真的走不動了,希望你自己不要后悔,遠方的你還在看著現在的你。

本篇文章繼續抒寫上篇文章未寫完的知識點,本篇文章講介紹賦值運算符和表達式、sizeof()、逗號運算符和表達式、條件運算符(三目運算)。

賦值運算符和表達式

1、賦值運算符
(1)單純賦值運算符“=”
在前面的講解中,讀者已多次看到了符號“=”。在C語言中,“=”不是等號,而是賦值運算符,它是個雙目運算符,結合性是從右向左,其作用是將賦值號“=”右邊的操作數賦給左邊的操作數。
例如: x = 20; y = 30;
(2)復合賦值運算符“+=”、“?=”、“*=”、“/=”
在賦值符“=”之前加上其他運算符,即構成復合的運算符。C語言規定有10種復合賦值運算符,“%=”、“<<=”、“>>=”、“&=”、“^=”和“|=”,這些將在后面位運算中介紹。如圖表1-1。

2、賦值表達式
用賦值運算符將一個變量和一個表達式連接起來,就成了賦值表達式。一般形式如下:
<變量名><賦值運算符><表達式> 即:變量 = 表達式
對賦值表達式求解的過程是,將賦值運算符右側的“表達式”的值賦給左側的變量。賦值表達式的值就是被賦值的變量的值,如“a = 10”這個賦值表達式的值是10。

    3、特殊的賦值運算——自增自減運算符
    “++”是自增運算符,它的作用是使變量的值增加1。“??”是自減運算符,其作用是使變量的值減少1,例如:
    i = i+1
    這個賦值表達式是把變量i的值加上1后再賦給i,即將變量i的值增加1。那么在這里就可以利用自增運算符簡化這個賦值表達式為
    i++ 或 ++i

這里有兩點需要注意。

① 自增/自減運算符僅用于變量,不能用于常量或表達式。
② 自增和自減的結合方向是自右至左。
自增和自減運算符可用在操作數之前,也可放在其后,但在表達式中這兩種用法是有區別的。自增或自減運算符在操作數之前,C語言在引用操作數之前就先執行加1或減1操作;運算符在操作數之后,C語言就先引用操作數的值,而后再進行加1或減1操作。

例如:
j=i++;
其執行過程是:先將變量i的值賦值給變量j,再使變量i的值增1。結果是i的值為3,j的值為2。等價于下面兩個語句:
j=i;
i=i+1;
再看以下示例:
j=++i;
其執行過程是,先將變量i的值增1,再把新i的值賦給變量j。結果是i=3,j=3。
該語句等價于下面兩個語句:
i = i+1;
j=i;

3、賦值運算符中類型的轉換
前面已經介紹了類型轉換,當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換,轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變量的類型。具體的轉換如下:
(1)浮點型與整型
將浮點數(單雙精度)轉換為整數時,將舍棄浮點數的小數部分,只保留整數部分。將整型值賦給浮點型變量,數值不變,只是改為浮點形式, 即小數點后帶若干個0。注意:賦值時的類型轉換實際上是強制的。
(2)單、雙精度浮點型
由于C語言中的浮點數總是用雙精度表示的,所以float 型數據只是在尾部加0延長為double型數據參加運算,然后直接賦值。double型數據轉換為float型時,通過截尾數來實現,截斷前要進行四舍五入操作。
(3)char型與int型
int型數值賦給char型變量時,只保留其最低8位,高位部分舍棄。
char型數值賦給int型變量時,一些編譯程序不管其值大小都作正數處理,而另一些編譯程序在轉換時,若char型數據值大于127,就作為負數處理。對于使用者來講,如果原來char型數據取正值,轉換后仍為正值;如果原來char型值可正可負,則轉換后也仍然保持原值,只是數據的內部表示形式有所不同。
(4)int型與long型
long型數據賦給int型變量時,將低16位值送給int型變量,而將高16 位截斷舍棄。(這里假定int型占兩個字節)。 將int型數據送給long型變量時,其外部值保持不變,而內部形式有所改變。
(5)無符號整數
將一個unsigned型數據賦給一個占據同樣長度存儲單元的整型變量時(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照賦,內部的存儲方式不變,但外部值卻可能改變。
將一個非unsigned整型數據賦給長度相同的unsigned型變量時,內部存儲形式不變,但外部表示時總是無符號的。

逗號運算符和表達式

C語言中逗號“,”也是一種運算符,稱為逗號運算符。其功能是把兩個表達式連接起來組成一個表達式,其一般形式如下。
表達式1,表達式2
其求值過程是分別求兩個表達式的值,并以表達式2的值作為整個逗號表達式的值。

對于逗號運算符需要說明3點:
① 逗號表達式一般形式中的表達式1和表達式2也可以是逗號表達式。例如“表達式1,(表達式2,表達式3)”。這樣就形成了嵌套情形。
因此可以把逗號表達式擴展為以下形式“表達式1,表達式2,……,表達式n”,整個逗號表達式的值等于表達式n的值。
② 程序中使用逗號表達式,通常是要分別求逗號表達式內各表達式的值,并不一定要求整個逗號表達式的值。
③ 并不是在所有出現逗號的地方都組成逗號表達式,如在變量說明中,函數參數表中逗號只是用作各變量之間的間隔符。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        int x = 10, y = 15,z = 0;
         z = (x + 10,y + 10);
        printf("%d\n",z);
        
            }
    return 0;
}
輸出結果:25
        Program ended with exit code: 0

sizeof運算符

sizeof是一個單目運算符,它的運算對象是變量或數據類型,運算結果為一個整數。運算的一般形式如下:
sizeof(<類型或變量名>)
說明:它只針對數據類型,而不針對變量!
若運算對象為變量,則所求的結果是這個變量占用的內存空間字節數;若運算對象是數據類型,則所求結果是這種數據類型的變量占用的內存空間字節數。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        struct stuct {
            char *name;
            int a[10];
            int b;
        }stu;
        int a = 10;
        double b = 30;
        float c = 5;
        char d = 'a';
        printf("a bytes %lu\n",sizeof(a));
         printf("b bytes %lu\n",sizeof(b));
         printf("c bytes %lu\n",sizeof(c));
         printf("d bytes %lu\n",sizeof(d));
         printf("stu bytes %lu\n",sizeof(stu));
            }
    return 0;
}
輸出結果:
        a bytes 4
        b bytes 8
        c bytes 4
        d bytes 1
        stu bytes 56
        Program ended with exit code: 0

條件運算符

條件運算符(?)是C語言中唯一一個三目運算符,它可以提供如if-then-else語句的簡易操作,其運算的一般形式如下。
<表達式1> ? <表達式2> : <表達式3>
操作符“?”作用是這樣的:先計算表達式1的邏輯值,如果其值為真,則計算表達式2,并將數值結果作為整個表達式的數值;如果表達式1的邏輯值為假,則計算表達式3,并以它的結果作為整個表達式的值,
條件運算符的優先級高于賦值運算符,讀者可以自行分析一下以下語句的含義。
max = (a>b)?a:b
由于條件運算符的優先級高于賦值運算符,因此,先計算賦值語句的右邊部分。
當a大于b為真(即a大于b)時,條件表達式的值為a;當a大于b為假(即a大于b不成立)時,條件表達式的值為b。因此,max變量的值就是a和b中較大的值(若a與b相等時取b)。
相當于下面的語句:
if (a > b)
max = a;
else
max = b;
有一個面試題:寫一個標準的比較兩個數大小取大的數的一個宏定義。
#define max a > b ? a : b

總結

這篇文章介紹了很多知識點,例子雖然沒有舉的不多,但是確實精華,希望讀者自己下來多去聯系,俗話說的好“師傅領進門,修行靠自己”。

結尾

最后,希望讀者在讀文章的時候發現有錯誤或者不好的地方,歡迎留言,我會及時更改,感謝你的閱讀和評論已經點贊收藏。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容