1. 程式人生 > >C語言操作符總結+詳解!

C語言操作符總結+詳解!

下表即為C語言全部常用的操作符

操作符的優先順序從高至低按由上到下的順序排列

操作符 描述 用法示例 結果型別 結合性 是否控制求值順序
() 聚組 (表示式) 與表示式相同 N/A
() 函式呼叫 rexp(rexp,…,rexp) rexp L-R
[ ] 下標引用 rexp[rexp] lexp L-R
. 訪問結構成員 lexp.member_name lexp L-R
-> 訪問結構指標成員 rexp->member_name lexp L-R
++ 字尾自增 lexp ++ rexp L-R
- - 字尾自減 lexp – rexp L-R
! 邏輯反 ! rexp rexp R-L
~ 按位取反 ~ rexp rexp R-L
+ 單目,表示正值 + rexp rexp R-L
- 單目,表示負值 - rexp rexp R-L
++ 字首自增 ++ lexp rexp R-L
字首自減 – lexp rexp R-L
* 間接訪問 * rexp lexp R-L
& 取地址 & lexp rexp R-L
sizeof 取其長度,以位元組表示 sizeof(型別) rexp R-L
(型別) 型別轉換 (型別) rexp rexp R-L
* 乘法 rexp * rexp rexp L-R
/ 除法 rexp / rexp rexp L-R
% 整數取餘 rexp % rexp rexp L-R
+ 加法 rexp + rexp rexp L-R
- 減法 rexp - rexp rexp L-R
<< 左移位 rexp << rexp rexp L-R
>> 右移位 rexp >> rexp rexp L-R
> 大於 rexp > rexp rexp L-R
>= 大於等於 rexp >= rexp rexp L-R
< 小於 rexp < rexp rexp L-R
<= 小於等於 rexp <= rexp rexp L-R
== 等於 rexp == rexp rexp L-R
!= 不等於 rexp != rexp rexp L-R
& 位與 rexp & rexp rexp L-R
^ 位異或 rexp ^ rexp rexp L-R
豎槓 位或 rexp rexp 豎槓rexp L-R
&& 邏輯與 rexp && rexp rexp L-R
雙豎槓 邏輯或 rexp 雙豎槓 rexp rexp L-R
?: 條件操作符 rexp ? rexp : rexp rexp N/A
= 賦值 lexp = rexp rexp R-L
+= 以…加 lexp += rexp rexp R-L
-= 以…減 lexp -= rexp rexp R-L
*= 以…乘 lexp *= rexp rexp R-L
/= 以…除 lexp /= rexp rexp R-L
%= 以…取模 lexp %= rexp rexp R-L
<<= 以…左移 lexp <<= rexp rexp R-L
>>= 以…右移 lexp >>= rexp rexp R-L
&= 以…與 lexp &= rexp rexp R-L
^= 以…異或 lexp ^= rexp rexp R-L
豎槓= 以…或 lexp 豎槓= rexp rexp R-L
逗號 rexp,rexp rexp L-R

(由於表格編輯問題,表中的“|”用“豎槓”代替)

操作符的分類:

算術操作符

+   -   *   /   %

除了%操作符只能用於整數外,其他幾個操作符可以用於整數和浮點數。
對於/操作符如果兩個操作符都為整數,執行整數除法,當存在浮點數時就執行浮點數除法。

移位操作符

<<  //左移
>>  //右移

移位在二進位制下進行
左移操作符規則:左邊拋棄,右邊補0

int num = 10;
num<<1

num在記憶體中的二進位制00000000000000000000000000001010
變為00000000000000000000000000010100
右移操作符規則:
分為兩種:1.邏輯移位左邊用0填充,右邊丟棄
2.算術移位左邊用原該值的符號位填充,右邊丟棄
具體使用哪一種取決於編譯器
另外,不要移動負數位

num>>-1; //錯誤的使用

位操作符

&   //按位與  兩個二進位制數比較,相同位數上的數一樣返回值位1
|   //按位或  相同位數上有1返回值就為1
^   //按位異或  相同位數上的數相同返回值為0,相異返回值為1

注:它們的運算元必須是整數。
輸入如下程式碼看看它們的值是多少

 #include <stdio.h>
    int main()
    {
        int num1=2;
        int num2=2;
        int a = num1 & num2;
        int b = num1 | num2;
        int c = num1 ^ num2;
        printf(“%d %d %d”,a,b,c)
        return 0;
    }    

位操作符的妙用
不建立臨時變數,實現兩個數的交換

#include <stdio.h>
int main()
{
     int a = 10;
     int b = 20;
     a = a^b;
     b = a^b;
     a = a^b;
     printf("a = %d  b = %d\n", a, b);
     return 0;
}

賦值操作符

int a = 1;
a = 100;

複合賦值符

+=  *=  /=  %=  >>=  <<=  &=  |=  ^=

單目操作符

!  -  +  &  sizeof  ~  --  ++  *  (型別)

關係操作符

>  >=  <  <=  !=  ==

邏輯操作符

&&   邏輯與
||   邏輯或

條件操作符

exp1 ? exp2 : exp3

逗號表示式

exp1, exp2, exp3, ...

下表引用、函式呼叫和結構成員

1.[]下標引用操作符

int arr[10];
arr[9] = 10;

這裡也可以用9[arr]來表示
2.()函式呼叫操作符

  int main
    {
         test1();
         test2(1);
    }

3 .訪問結構成員
結構體.成員名
結構體指標->成員名

#include <stdio.h>
struct Stu
{
     char name[10];
     int age;
     char sex[5];
     double score;
};
void set_age1(struct Stu stu)
{
     stu.age = 18;
}
void set_age2(struct Stu* pStu)
{
     pStu->age = 18;//結構成員訪問
}
int main()
{
     struct Stu stu;
     struct Stu* pStu = &stu;//結構成員訪問
     stu.age = 20;//結構成員訪問
     set_age1(stu);
     pStu->age = 20;//結構成員訪問
     set_age2(pStu);
     return 0;
}