[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.是否控制求值順序。
兩個相鄰的操作符先執行哪個,取決於他們的優先順序。如果兩者優先順序相同,取決於他們的結合性。