1. 程式人生 > >[C語言]大放送!C語言操作符大總結

[C語言]大放送!C語言操作符大總結

簡介

  c語言之所以對於很多人來說很難,就是因為它的操作符太多,很多人不能熟練掌握導致學起來有困難,本文將c語言中的各種操作符進行彙總以便於大家學習。

正文

一、分類

操作符可以分為以下類別:
算數操作符、移位操作符、位操作符、賦值操作符、單目操作符、關係操作符、邏輯操作符、條件操作符、逗號表示式、下標引用、函式呼叫和結構成員。

二、介紹

  1、首先,我們從算術操作符開始,算數運算子用於各類數值運算,那麼算術操作符有哪些呢?

+   -   *   /   %

這些大家都不陌生,有一些細節需要提一提:
(1)、除了%操作符之外,其他的幾個運算元可以作用於整數和浮點數。
(2)、對於/操作符,如果兩個運算元都為整數,執行整數除法。而只要有浮點數就執行浮點數除法。
(3)、%操作符的兩個運算元必須為整數。返回的是整除之後的餘數。

   2、移位操作符
移位操作符執行後,對變數無影響。

<<   左移操作符
>>  右移操作符

左移操作符的移位規則:

左邊拋棄、右邊補0
如圖為移位方式
在這裡插入圖片描述

右移操作符的移位規則:

右移操作分為兩種:
(1)算術右移:左邊用原該值的符號位填充,右邊丟棄
(2)邏輯右移:左邊用0填充,右邊丟棄
在這裡插入圖片描述

注意:對於移位運算子,不要移動負數位,這個是標準未定義的。

例如:

int num = 10;
num>>-1;//error

  3、位操作符
位操作符是針對於二進位制位來運算的,有以下操作符:

&    按位與
|      按位或
^    按位異或

注意:它們的運算元必須是整數。
按位與:二進位制位中做運算的兩個位都為1則為1,有0則為0;
按位或:二進位制位中做運算的兩個位有1則為1,都為0則為0;
按位異或:二進位制位中做運算的兩個位相異為1,相同為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;
}

  4、賦值操作符
賦值操作符 = 就是用來給你的定義的變數重新賦值。

int a = 0;
a = 100;//重新賦值為100

還有複合賦值符

+=      a = a+1可以寫成a+=1;下面的以此類推
-=
*=
/=
%=
>>=
<<=
&=
|=
^=

  5、單目操作符
單目操作符是指運算所需變數為一個的運算子,下面列舉出來單目運算子:

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

接下來對單目操作符進行一 一分析:
(1)!邏輯反操作
  對邏輯進行取反,如果為真,運算後變為假,反之亦然;
(2)-和+沒什麼可講的,表示正負,上過小學的都會;
(3)& 取地址操作符
  從記憶體中取地址(注:不能從暫存器register中取址。);
(4)sizeof 運算元的型別長度
  用法:sizeof(型別說明符,陣列名或表示式)或sizeof(變數名)。
可以求變數(型別)所佔空間的大小(注意:sizeof不是函式,它是一個操作符);

#include<stdio.h>
int main()
{
 int a = 10;
 int *p = NULL;
 p = &a;
 printf("%d\n",sizeof(a));//輸出4
 printf("%d\n",sizeof(int));//輸出4
 printf("%d\n",sizeof a);//輸出4
 //printf("%d\n",sizeof int);//語法錯誤
 return 0;
}

sizeof和陣列

#include<stdio.h>
void test1(int arr[])
{
 printf("%d\n",sizeof(arr));//40  計算的是陣列大小
}
void test2(char ch[])
{
 printf("%d\n",sizeof(ch));//10   同上
}
int main()
{
 int arr[10] = {0};
 char ch[10] = {0};
 printf("%d\n",sizeof(arr));//4  計算的是指標
 printf("%d\n",sizeof(ch));//4   同上
 test1(arr);
 test2(ch);
 return 0;
}

(5)~ 對一個二進位制數按位取反
  對一個二進位制數每一位0變1,1變0;
(6)-- 這個操作符分為前置--和後置--
  前置--表示先進行自減,再引用
  後置--表示先引用,然後自減
  ++操作符同理;
程式碼如下

#include<stdio.h>
int main()
{
	int a = 10;
	int x = ++a;//先對a進行自增,然後使用a的值賦給x,x為11
	int y = --a;//先對a進行自減,然後使用a的值賦給y,y為10
	int w = a--;//先使用a的值,再給a自減,這樣w的值為10,之後a變為9
	int z = a++;//先使用a的值,再給a自增,這樣z的值為9,之後變為10
	return 0;
}

  6、關係操作符
關係操作符就是用作比較的時候用的

>    大於
<    小於
>=    大於等於
<=    小於等於
!=    不等於
==    等於

唯一要注意的就是不要混淆了==和=的區別。
  7、邏輯操作符
表示式1&&表示式2---------------->全真則為真
表示式1 | | 表示式2----------------->有真則為真

&&    邏輯與
||     邏輯或

注意:要區分邏輯或和按位或,邏輯與和按位與

1&2 ==0   對二進位制計算
1&&2 ==1  看邏輯
1|2 == 3
1||2 == 1

一道筆試題

#include<stdio.h>
int main()
{
 int i = 0,a = 0,b = 2,c = 3,d = 4;
 //i = a++ && ++b && d++;      //執行完a=1,b=2,c=3,d=4;&&前為假後面就不用算了
 i = a++ || ++b || d++;        //執行完a=1,b=3,c=3,d=4;||前為真後面就不用算了
 printf("a = %d\n b = %d\n c = %d\n d = %d\n",a,b,c,d);
 return 0;
}

  8、條件操作符(三目操作符)

表示式1?表示式2:表示式3

表示式1若為真則執行表示式2,為假則執行表示式3.
  9、逗號表示式

表示式1,表示式2,表示式3, …表示式n

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

int a = 1;
int b = 2;
int c = (a>b,a=b+10,a,b=a+1);//從左向右依次執行,最終算出c等於13

  10、下標引用、函式呼叫和結構成員
(1)[ ]下標引用操作符
運算元:一個數組名和一個索引值

int arr[10];//建立陣列
arr[9] = 10;//使用下標引用操作符
//[]的兩個運算元是arr和9

(2)()函式呼叫操作符,接受一個或者多個運算元:第一個運算元是函式名,剩餘的運算元就是傳遞給函式的引數。
比如在主函式呼叫之前定義的函式

#include<stdio.h>
void test1()
{
	printf("abc\n");
}
void test2(const char *str)
{
	printf("%s\n",str);
}
int main()
{
	test1();//使用()作為函式呼叫操作符。
	test2("def");//使用()作為函式呼叫操作符。
	return 0;
}

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

.    結構體.成員名
->   結構體指標->成員名

#include<stdio.h>
struct Stu//定義一個結構體
{
 char name[10];
 int age;
 char sex[5];
};
void set_age1(struct Stu 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;
}

給結構體成員賦字串用strcpy函式,賦數值的話就直接賦。

struct Stu s = {0};
strcpy (S.name,"張三");
//也可以這樣
struct  stu
{
	char name[10];
	int age;
	char sex[5];
};
int main()
{
	struct stu s = {"李四"20"男"};//注意順序不能亂
	struct stu *ps = &s;
	printf("%s\n",(*ps).name);//輸出名字
	//ps->name//或者這樣輸出
}

  運算子的優先順序
附上關於運算子優先順序以及結合性的表如下:
在這裡插入圖片描述
在這裡插入圖片描述

##總結
操作符的屬性
1.操作符的優先順序
2.操作符的結合性
3.是否控制求值順序。
兩個相鄰的操作符先執行哪個,取決於他們的優先順序。如果兩者優先順序相同,取決於他們的結合性。