1. 程式人生 > >C語言——操作符大全

C語言——操作符大全

C語言中的操作符整理

(一)算術操作符

(+)(-)(*)(/)(%)
(1)%操作符的兩個運算元必須為整數,返回整除之後的餘數,餘數也為整數。
(2)除%以外的運算子的運算元都可以是任何算術型別。
(3)對於/操作符,兩個實數相除的結果是雙精度實數,兩個整數相除的結果是整數。
(二)關係操作符——6種

1____> (大於)
2____>=(大於等於)
3____<(小於)
4____<=(小於等於)
5____==(等於)
6____!=(不等於)
優先順序比較:
前四個(>,>=,<,<=)的優先順序相同,後兩個的優先順序相同,但前者比後者優先順序高。
關係操作符的應用——關係表示式



·表示式的值是邏輯值,非真即假——0為假,非0為真。
注意!!!不要將 == (等於符號)和 = (賦值操作符)寫錯。

(三)位操作符

應用二進位制的思想理解,數值在記憶體中以二進位制補碼的形式存在。
正數的補碼為原碼,負數的補碼為:符號位不變,原碼取反加一。

&(按位與)——全1為1,否則為0
|(按位或)——有1為1,否則為0
^(按位異或)——相同為0,不同為1
注意:位操作符的運算元都為整數。

舉例程式碼如下:

 int a = 1;
 int b = 2;
 int c = a & b;
 int d = a | b;
 int e = a ^ b;
 printf("c = %d\nd = %d\ne = %d\n", c, d, e);
 
   //        a——00000000000000000000000000000001
   //        b——00000000000000000000000000000010
   //c = a & b——00000000000000000000000000000000——0
   //d = a | b——00000000000000000000000000000011——3 
   //e = a ^ b——00000000000000000000000000000011——3

執行結果如下:
在這裡插入圖片描述
(四)移位操作符

應用二進位制的思想理解,數值在記憶體中以二進位制補碼的形式存在。
正數的補碼為原碼,負數的補碼為:符號位不變,原碼取反加一。
(<<) 左移操作符
(>>) 右移操作符

!!!

注意:移位數不能為負數。

(1)左移操作符
移位規則:左邊拋棄,右邊補0

 int a = 10;
 int b = a << 1;
 printf("a = %d\nb = %d\n", a, b);
 
 //     00000000000000000000000000001010--a在記憶體中的二進位制
 //  (0)00000000000000000000000000010100--a左移一位產生的結果,
 //左移出去的0拋棄

運算結果如下:
在這裡插入圖片描述
實際上,a沒有被賦值,自身的值不會變化。
(2)右移操作符
移位規則:
右移運算子分為兩種:
1,邏輯移位:左邊補0,右邊拋棄
2,算術移位:左邊用原該值的符號位填充 ,右邊丟棄。



舉例程式碼如下:

 int a = -1;
 int b = a >> 1;
 printf("a = %d\nb = %d\n", a, b);
 //  -1原碼——10000000000000000000000000000001
 //  -1補碼——11111111111111111111111111111111
  //邏輯右移——01111111111111111111111111111111(1)
         //——右邊拋棄,左邊補0
  //算術右移——11111111111111111111111111111111(1)
           ——左邊用原該值的符號位填充,右邊拋棄

在VS編譯器下執行結果為:
為算術右移
在這裡插入圖片描述
(五)賦值操作符

( = )
複合賦值符:

(+=)
(-=)
(*=)
(/=)
(%=)
(>>=)
(<<=)
(&=)
(|=)
(^=)
舉例程式碼如下:

 int a = 2;
//下面兩行程式碼所表示的意義一樣
 a = a + 1;     //a = 3
 a += 1;           //a = 3

(六)邏輯操作符

1.&& (邏輯與)——a && b(如果a,b都為真,則結果為真)
2.||(邏輯或)——a|| b(只要有一個以上為真,則為真,否則為假)
3.!(邏輯非)——!a

優先順序比較:

! 的優先順序高於 && 和 ||
邏輯操作符的應用——邏輯表示式

·表示式的值有真假——0為假,非0為真
舉例程式碼如下:

int a = 3;
int b = 6;
int c = 0;
a && b;
//3 && 6---1
a && b && c;
//3 && 6 && 0---0
a || b;
//3 || 6---1
a || b || c;
//3 || 6 || 0---0

注意: 在邏輯表示式的求解中 ,並不是所有的邏輯運算子都被執行!!!
只是在必須執行下一個邏輯運算子才能求出表示式的解時,才執行該運算子。


(1)在邏輯與(&&)的表示式求解中,從左到右依次求解,遇 0 則停。後面的邏輯運算子不執行。
(2)在邏輯或(||)的表示式求解中,從左到右依次求解,遇 1 則停。後面的邏輯運算子不執行。
舉例程式碼如下:
邏輯與(&&)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 3;
int b = 6;
int c = 0;

//執行下面一句程式碼時,先執行c = 0,先用c參與邏輯表示式的計算,結果為假
//則後面的邏輯運算子都不用求解,再執行c++,則c=1,a=3,b=6
int i = c++ && ++a && ++ b;
printf("c = %d\na = %d\nb = %d\n", c, a, b);
system("pause");
return 0;
}

執行結果如圖:

在這裡插入圖片描述
邏輯或(||)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 3;
int b = 6;
int c = 0;

//執行下面一句程式碼時,先執行c = 0,結果為假,邏輯表示式可以繼續求解,再執行
//c++,然後執行++a,a = 4,結果為真,則後面的邏輯運算子不求解
int i = c++ || ++a || ++ b;
printf("c = %d\na = %d\nb = %d\n", c, a, b);
system("pause");
return 0;
}

執行結果如圖:
在這裡插入圖片描述
(七)條件操作符

條件表示式的一般形式:表示式1 ? 表示式2:表示式3
舉例程式碼如下:

int a = 3;
int b = 6;
int c = 0;
c = a > b ? a : b;
//a > b 為表示式1,a為表示式2,b為表示式3
//該語句的意思為:如果a>b,則將a的值賦給c,否則將b的值賦給c

以上語句等價於下面的if…else語句

int a = 3;
int b = 6;
int c = 0;
if (a > b)
{
c = a;
}
else
{
c = b;
}

(八)單目操作符

(!)——邏輯反操作,前面已經介紹
(-)——負值
(+)——正值
(&)——取地址
(~)——對一個數的二進位制位按位取反
(*)——間接訪問操作符(解引用操作符)
(–)——前置,後置–
(++)——前置,後置++
(sizeof)——運算元的型別長度(以位元組為單位)
((型別))——強制型別轉換

(1)++,-- 操作符

前置:如++ i,-- i,在使用i之前,先使i 的值加,減1
後置:如i++,i–,先使用i,使用完之後,使i的值加,減1
簡單程式碼舉例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int a = 1;
 int b = 2;
 int a1 = a++;        //a1 = 1,a = 2
 int a2 = ++a;        //a2 = 3,a = 3
 int b1 = b--;          //b1 = 2,b = 1
 int b2 = --b;          //b2 = 0,b = 0
 printf("a1 = %d\na2 = %d\nb1 = %d\nb2 = %d\n", a1,a2,b1,b2);
 system("pause");
 return 0;
}

執行結果如下:

在這裡插入圖片描述
(2)(型別)操作符——強制型別轉換符

(型別名)(表示式)
表示式和型別名都應該用括號括起來
例如:
(double)a——(將a轉換成double型別)
(int)(x+y)——(將x+y的值轉換成int型)
(float)(5%4)——(將5%3的值轉換成float型)
(3)sizeof

  • sizeof可以求變數(型別)所佔空間的大小。

  • sizeof 不是函式,是操作符。

  • sizeof後面是變數的話,後面的括號可省略;如果後面是型別,則括號不可省略。
    具體程式碼如下:

 int a = 10;
 printf("%d\n", sizeof(a));
 printf("%d\n", sizeof(int));
  printf("%d\n", sizeof a);

執行結果如下:
在這裡插入圖片描述

 int a = 10;
 printf("%d\n", sizeof int);

在這裡插入圖片描述

  • sizeof後面的表示式不參與運算
    舉例程式碼如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int a = 10;
 short b = 5;
 
 printf("%d\n", sizeof(b = a + 2));
//sizeof後的表示式不參與運算,因此此處只計算b的大小,且不執行a+2

 printf("b = %d\n", b);
 printf("a = %d\n", a);
 system("pause");
 return 0;
}

執行結果如下:
在這裡插入圖片描述

  • sizeof和陣列

在主函式中,sizeof可計算陣列的大小,但如果陣列作為引數,傳入被呼叫函式,則sizeof計算的不是陣列大小
在被呼叫函式中:sizeof(陣列名)都為4
程式碼如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void test1(int arr[])
{
 printf("%d\n", sizeof(arr));//---------------4
}
void test2(char ch[])
{
 printf("%d\n", sizeof(ch));//-----------------4
}
int main()
{
 int arr[10] = { 0 };
 char ch[10] = { 0 };
 printf("%d\n", sizeof(arr));//----------------40
 printf("%d\n", sizeof(ch));//-----------------10
 test1(arr);
 test2(ch);

執行結果如下:
在這裡插入圖片描述

(九)逗號表示式

逗號表示式就是用逗號隔開的多個表示式。
逗號表示式從左到右依次執行。整個表示式的結果是最後一個表示式的結果。
舉例程式碼如下:

 int a = 1;
 int b = 2;
 
 int c = (a > b, a = b + 10, a, b = a + 1);
//a>b為假,表示式值為0
//a=b+10-----a=2+10=12
//a=12
//b=a+1------b=12+1=13
//c=13

 printf("c = %d\n", c);

執行結果為:

在這裡插入圖片描述
(十)下標引用,函式呼叫和結構成員

(1)[ ]下標引用
運算元:一個數組名+一個索引值

int arr[10];   //建立陣列
arr[8] = 2;  //下標引用

//[ ]的兩個運算元為arr 和 8

(2)()函式呼叫操作符
接受一個或多個運算元:第一個運算元是函式名,剩餘的運算元就是傳遞給函式的引數。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void test1(int arr[])
{
 printf("%d\n", sizeof(arr));
}
void test2(char ch[])
{
 printf("%d\n", sizeof(ch));
}
int main()
{
 int arr[10] = { 0 };
 char ch[10] = { 0 };
 printf("%d\n", sizeof(arr));
 printf("%d\n", sizeof(ch));
 test1(arr);//——————————使用()作為函式呼叫操作符
 test2(ch);//——————————使用()作為函式呼叫操作符
system("pause");
 return 0;
}

(3)訪問一個結構的成員
結構名.成員名