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)訪問一個結構的成員
結構名.成員名