前言
C語言中的操作符是用于操作變量、常量和表達(dá)式的符號(hào),以下是我學(xué)習(xí)操作符整理的相關(guān)知識(shí)點(diǎn)。
操作符分類
算數(shù)操作符
算數(shù)操作符: + - * / %
-
+
、-
、*
、/
可以用于操作整數(shù)和浮點(diǎn)數(shù) -
%
只能操作整數(shù),返回整除后的余數(shù)
移位操作符
<< 左移操作符
>> 右移操作符
這兩個(gè)只能用于整數(shù)
-
<< 操作符
-
// 往左移,左邊丟掉,右邊補(bǔ)0 // 例子 int a = 3; // 3在內(nèi)存中二進(jìn)制 00000000 00000000 00000000 00000011 a = a << 1; // 往左移1位,左邊的丟掉,右邊的補(bǔ)0,結(jié)果為 00000000 00000000 00000000 00000110 // 此時(shí)a=6
-
-
>>操作符
-
/* 往右移,分兩種情況 邏輯移位: 左邊補(bǔ)0,右邊丟掉 算數(shù)移位: 左邊補(bǔ)原符號(hào),右邊丟掉 這里還有一個(gè)知識(shí)點(diǎn),就是負(fù)數(shù)在內(nèi)存中是以補(bǔ)碼的形式存在的 以下是-7的原碼,反碼,補(bǔ)碼 原碼: 第一位代表符號(hào)位 10000000 00000000 00000000 00000111 反碼: 右原碼除了符號(hào)位,其他位取反 11111111 11111111 11111111 11111000 補(bǔ)碼: 由反碼+1得到 11111111 11111111 11111111 11111001 */ // 例子 int a = -7; // -1在內(nèi)存中二進(jìn)制 11111111 11111111 11111111 11111001 a = a >> 1; // 往右移一位,通常是使用算數(shù)移位,補(bǔ)原符號(hào),得11111111 11111111 11111111 11111100 /* 補(bǔ)碼: 11111111 11111111 11111111 11111100 -1得到反碼: 11111111 11111111 11111111 11111011 取反得到原碼: 10000000 00000000 00000000 00000100 -> 4 此時(shí)a=4 */
-
位操作符
位操作符: & | ^
位操作符只能操作整數(shù)
-
&按位與
-
/* 使用兩個(gè)數(shù)的二進(jìn)制進(jìn)行運(yùn)算,只要有0就是0,全1才為1 */ #include <stdio.h> int main() { int x = 2; // 00000000 00000000 00000000 00000010 int y = 1; // 00000000 00000000 00000000 00000001 printf("%d\n", x & y); // 00000000 00000000 00000000 00000000 -> 0 int a = 15; // 00000000 00000000 00000000 00001111 int b = 8; // 00000000 00000000 00000000 00001000 printf("%d\n", a & b); // 00000000 00000000 00000000 00001000 -> 8 return 0; }
-
-
|按位或
-
/* 使用兩個(gè)數(shù)的二進(jìn)制進(jìn)行運(yùn)算,全0才為0,只要有1就為1 */ #include <stdio.h> int main() { int x = 2; // 00000000 00000000 00000000 00000010 int y = 1; // 00000000 00000000 00000000 00000001 printf("%d\n", x | y); // 00000000 00000000 00000000 00000011 -> 3 int a = 15; // 00000000 00000000 00000000 00001111 int b = 8; // 00000000 00000000 00000000 00001000 printf("%d\n", a | b); // 00000000 00000000 00000000 00001111 -> 15 return 0; }
-
-
^ 按位異或
-
/* 使用兩個(gè)數(shù)的二進(jìn)制進(jìn)行運(yùn)算,相同為0,不相同為1 */ #include <stdio.h> int main() { int x = 2; // 00000000 00000000 00000000 00000010 int y = 1; // 00000000 00000000 00000000 00000001 printf("%d\n", x ^ y); // 00000000 00000000 00000000 00000011 -> 3 int a = 15; // 00000000 00000000 00000000 00001111 int b = 8; // 00000000 00000000 00000000 00001000 printf("%d\n", a ^ b); // 00000000 00000000 00000000 00000111 -> 7 return 0; }
-
-
練習(xí)題
-
不能創(chuàng)建臨時(shí)變量(第三個(gè)變量),實(shí)現(xiàn)兩個(gè)數(shù)的交換
#include <stdio.h> int main() { int a = 2; // 00000000 00000000 00000000 00000010 int b = 3; // 00000000 00000000 00000000 00000011 a = a ^ b; // a -> 00000000 00000000 00000000 00000001 -> 1 b = a ^ b; // b -> 00000000 00000000 00000000 00000010 -> 2 a = a ^ b; // a -> 00000000 00000000 00000000 00000011 -> 3 // 最后a=3,b=2,實(shí)現(xiàn)了交換 return 0; }
-
編寫代碼實(shí)現(xiàn):求一個(gè)整數(shù)存儲(chǔ)在內(nèi)存中的二進(jìn)制中1的個(gè)數(shù)。
#include <stdio.h> int main() { int a = 15; // 00000000 00000000 00000000 00001111 int count = 0; while(a) { // 這里就只寫后8位了 // 第一輪: 00001111 & 00001110 -> 00001110 第二輪: 00001110 & 00001101 -> 00001100 a = a & (a - 1); count += 1; } printf("%d\n", count); // 4 return 0; }
-
賦值操作符
可以隨意操作變量的值
普通的賦值符 =
復(fù)合賦值符 +=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
// 復(fù)合賦值符
int a = 10;
a += 10; // 跟 a = a + 10 效果一樣
a <<= 10; // 跟 a = a >> 10 效果一樣
單目操作符
! 邏輯取反
- 負(fù)值
+ 正值
& 取地址
sizeof 操作符的類型長(zhǎng)度(以字節(jié)為單位)
~ 對(duì)一個(gè)數(shù)的二進(jìn)制取反
-- 前置--、后置--
++ 前置++、后置++
* 間接訪問操作符
(類型) 強(qiáng)制類型轉(zhuǎn)換
-
!
邏輯取反-
// 非0取反就是0,0取反就是1 #include <stdio.h> int main() { printf("%d\n", !6); // 0 printf("%d\n", !0); // 1 return 0; }
-
-
-
代表負(fù)值和+
代表正值 -
&
取地址-
// 獲取變量的地址 #include <stdio.h> int main() { int num = 66; printf("%p\n", &num); // 這里%p是打印的是地址,輸出的是num在內(nèi)存中的00000048F81CF884 return 0; }
-
-
sizeof
計(jì)算操作符的類型長(zhǎng)度-
#include <stdio.h> int main() { int num = 10; printf("%d\n", sizeof(num)); // 4 因?yàn)镮nt類型的字節(jié)數(shù)就是4 printf("%d\n", sizeof num); // 4 因?yàn)閟izeof是操作符,不是函數(shù),所以可以這樣寫 return 0; } // 以下是關(guān)于sizeof的一個(gè)練習(xí),依次輸出的數(shù)字是什么 #include <stdio.h> void test1(int arr1[]) { printf("%d\n", sizeof(arr1)); // 這里輸出的是內(nèi)存的字節(jié)數(shù),64位操作系統(tǒng),輸出8,32位則是4 } void test2(char arr2[]) { printf("%d\n", sizeof(arr2)); // 這里輸出的是內(nèi)存的字節(jié)數(shù),64位操作系統(tǒng),輸出8,32位則是4 } int main() { int arr1[10] = { 0 }; char arr2[10] = { 0 }; printf("%d\n", sizeof(arr1)); // 這里輸出的是10個(gè)int類型的字節(jié)數(shù),40 printf("%d\n", sizeof(arr2)); // 這里輸出的是10個(gè)char類型的字節(jié)數(shù),10 test1(arr1); test2(arr2); return 0; } // 所以答案是: 40 10 8 8
-
-
~
操作符-
// 二進(jìn)制按位取反 int a = 1; /* 1 -> 00000000 00000000 00000000 00000001 ~取反 -> 11111111 11111111 11111111 11111110 此時(shí)是負(fù)數(shù),存的是補(bǔ)碼,需要求出原碼 +1獲得反碼 -> 11111111 11111111 11111111 11111101 取反獲得原碼,符號(hào)不變 -> 10000000 00000000 00000000 00000010 -> -2 */ printf("%d\n", ~a); // -2
-
-
++
和--
-
// ++和-- 原理一致,以下以++為例 // 前置++,就是先++,后引用 int a = 3; int b = ++a; // 最后 a -> 4 ; b -> 4 // 后置++,就是先引用,后++ int a = 3; int b = a++; // 最后 a -> 4 ; b -> 3
-
-
*
間接訪問操作符-
// 一般配合&使用 #include <stdio.h> void test(int* num) { *num = 666; } int main() { int num = 0; // 此時(shí)需要一個(gè)函數(shù)改變num的值 test(&num); printf("%d\n", num); // 666 return 0; }
-
-
(類型)可以強(qiáng)制類型轉(zhuǎn)換
-
int a = 3.16; // 當(dāng)出現(xiàn)將double類型賦值給int類型的變量時(shí),編譯的時(shí)候會(huì)提示3.16是double類型的,使用a來接收的話可能會(huì)丟失數(shù)據(jù) int a = (int) 3.16; // 這樣就不會(huì)先出警告了
-
邏輯操作符
&& 邏輯與
|| 邏輯或
-
&&
邏輯與-
// 有0則為0,全非0為1 int main() { int a = 5; int b = 0; printf("%d\n", a && b); // 0 int x = 2; int y = 3; printf("%d\n", x && y); // 1 }
-
-
||
邏輯或-
// 只有有非0就為1,全0才為0 int main() { int a = 5; int b = 0; printf("%d\n", a || b); // 1 int x = 0; int y = 0; printf("%d\n", x || y); // 0 }
-
-
練習(xí)題
- 寫出程序輸出的結(jié)果
#include <stdio.h> int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; c = a++ && ++b && d++; printf("a = %d\t b = %d\t c = %d\t d = %d\n", a, b, c, d); return 0; } /* 當(dāng)執(zhí)行到c = a++ && ++b && d++;時(shí),此時(shí)是a++先引用后++ c = 0 && ++b && d++;因?yàn)?與上任何數(shù)都是0,所以后面的++b和d++不會(huì)執(zhí)行 最后輸出 a = 1 b = 2 c= 0 d = 4 */ // 擴(kuò)展,以下輸出結(jié)果是什么 #include <stdio.h> int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; c = a++ || ++b || d++; printf("a = %d\t b = %d\t c = %d\t d = %d\n", a, b, c, d); return 0; } // 這里輸出是a = 1 b = 3 c= 1 d = 4
- 寫出程序輸出的結(jié)果
條件操作符
格式: exp1 ? exp2 : exp3
當(dāng)exp1成立,執(zhí)行exp2,否則exp3
-
例子
-
// 請(qǐng)輸入一個(gè)整數(shù),如果這個(gè)整數(shù)比10大,輸出比10大,反之輸出小于等于10 #include <stdio.h> int main() { int num = 0; scanf("%d", &num); num > 10 ? printf("比10大\n") : printf("小于等于10\n"); // 這里使用的就是條件操作符 return 0; }
-
逗號(hào)表達(dá)式
格式: exp1, exp2, exp3, exp4
從左往右依次執(zhí)行,表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果
-
例子
-
int main() { int a = 1; int b = 1; int c = (a++, b += a, a += b); printf("%d\n", c); // 5 return 0; } /* 解析: 先是a++,a=2 然后b+=a,b=3 最后a+=b,a=5 所以c=5 */
-
下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
-
下標(biāo)引用操作符
[]
- 格式: 一個(gè)數(shù)組名 + 一個(gè)索引值
#include <stdio.h> int main() { int arr[5] = { 0 }; printf("%d\n", arr[2]); // 0 arr[2] = 10; // 這里使用下標(biāo)引用操作符修改了數(shù)組里的元素 // 2[arr] = 5; 這個(gè)其實(shí)也能生效,但是不會(huì)用,其實(shí)底層是*(2+arr) = 5; printf("%d\n", arr[2]); // 10 return 0; }
- 格式: 一個(gè)數(shù)組名 + 一個(gè)索引值
-
函數(shù)調(diào)用操作符
()
- 格式: 函數(shù)名+()
int test() { return 1; } int main() { int num = test(); // 函數(shù)后面的()就是函數(shù)調(diào)用操作符 return 0; }
- 格式: 函數(shù)名+()
-
訪問一個(gè)結(jié)構(gòu)的成員文章來源:http://www.zghlxwxcb.cn/news/detail-428164.html
-
.
:結(jié)構(gòu)體.成員名,->
:結(jié)構(gòu)指針->成員文章來源地址http://www.zghlxwxcb.cn/news/detail-428164.html// 定義結(jié)構(gòu)體 struct Stu { char name[10]; int age; char sex[5]; }; // 使用結(jié)構(gòu)指針 void set_age(struct Stu* pStu) { pStu->age = 20; } // 使用結(jié)構(gòu)體 void print_age(struct Stu stu) { printf("%d\n", stu.age); } int main() { struct Stu stu; set_age(&stu); print_age(stu); // 20 return 0; }
-
到了這里,關(guān)于C語言的操作符的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!