??博客主頁:江池俊的博客
?收錄專欄:C語言初階之路
??其他專欄:數(shù)據(jù)結(jié)構(gòu)探索
??代碼倉庫:江池俊的代碼倉庫
?? 如果覺得博主的文章還不錯(cuò)的話,請點(diǎn)贊??收藏?? 三連支持一下博主??
目錄
操作符分類:?
???算術(shù)操作符?
???移位操作符?
原碼、反碼、補(bǔ)碼
??左移操作符 <<
??右移操作符 >>
??位操作符?
???按位與?&
???按位或?|
???按位異或?^
??賦值操作符
??單目操作符
??邏輯反操作?!?
??(負(fù)值)-?(正值)+
??地址運(yùn)算符 &
??sizeof運(yùn)算符?
???位取反運(yùn)算符 ~
???遞減運(yùn)算符 --?
??遞增運(yùn)算符 ++
???間接尋址運(yùn)算符?*
??強(qiáng)制類型轉(zhuǎn)換 (類型)
??關(guān)系操作符
??邏輯操作符
??條件操作符
??逗號表達(dá)式
??下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
??下標(biāo)引用操作符?[ ]
???函數(shù)調(diào)用操作符 ()
??訪問一個(gè)結(jié)構(gòu)的成員? . or ->
??C語言運(yùn)算符優(yōu)先級表?
操作符分類:?
1.算術(shù)操作符
2.移位操作符
3.位操作符
4.賦值操作符
5.單目操作符
6.關(guān)系操作符
7.邏輯操作符
8.條件操作符
9.逗號表達(dá)式
10.下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
???算術(shù)操作符?
+ - * / %
1. 除了 % 操作符之外,其他的幾個(gè)操作符可以作用于整數(shù)和浮點(diǎn)數(shù)。
2. 對于 / 操作符如果兩個(gè)操作數(shù)都為整數(shù),執(zhí)行整數(shù)除法。而只要有浮點(diǎn)數(shù)執(zhí)行的就是浮點(diǎn)數(shù)除法。
3. % 操作符的兩個(gè)操作數(shù)必須為整數(shù)。返回的是整除之后的余數(shù)。?
???移位操作符?
<< 左移操作符
>> 右移操作符 ? ?
注:移位操作符的操作數(shù)只能是整數(shù)。
移位操作符移動的其實(shí)是二進(jìn)制的位
??那么一個(gè)數(shù)字在計(jì)算機(jī)中的二進(jìn)制序列是什么樣的呢?
對于一個(gè)整數(shù)是4個(gè)字節(jié),然而一個(gè)字節(jié)是8個(gè)bit位,那么一個(gè)整數(shù)就是32個(gè)bit位,而其中二進(jìn)制的一個(gè)0或者一個(gè)1只占用一個(gè)bit位,所以一個(gè)整數(shù)寫成二進(jìn)制序列的時(shí)候,就是32個(gè)bit位。
???對于有符號整數(shù)來說,最高位的一位是符號位:
? ? ? ??? 符號位是1表示負(fù)數(shù)
? ? ? ??? 符號位是0表示正數(shù)
???對于無符號整數(shù)來說,沒有符號位,所有位都是有效位。
現(xiàn)在我們知道了它們的二進(jìn)制序列,
??那么它們在計(jì)算機(jī)中又是怎么進(jìn)行計(jì)算的呢?
原碼、反碼、補(bǔ)碼
整數(shù)的二進(jìn)制表示形式有三種:原碼、反碼、補(bǔ)碼
原碼:按照數(shù)值的正負(fù),直接寫出的二進(jìn)制序列
反碼:原碼的符號位不變,其他位按位取反(即0變1,1變0)
補(bǔ)碼:反碼的二進(jìn)制+1就得到了補(bǔ)碼
對于正數(shù)來說,原碼、反碼、補(bǔ)碼相同,無需計(jì)算
對于負(fù)數(shù)來說,原碼、反碼、補(bǔ)碼不相同,是需要計(jì)算的?
???整數(shù)在內(nèi)存中存儲的都是補(bǔ)碼的二進(jìn)制序列
???整數(shù)在計(jì)算的時(shí)候也使用的補(bǔ)碼!
例如:
原碼:00000000 00000000 00000000 00001010
反碼:00000000 00000000 00000000 00001010
補(bǔ)碼:00000000 00000000 00000000 00001010
-10:
原碼:10000000 00000000 00000000 00001010
反碼: 11111111 ?11111111 ? 11111111 ?1111 0101
補(bǔ)碼: 11111111 ?11111111 ? 11111111 ?1111 0110
??左移操作符 <<
移位規(guī)則:
左邊拋棄、右邊補(bǔ)0
如圖所示:
??右移操作符 >>
?移位規(guī)則:
首先右移運(yùn)算分兩種:
1. 邏輯移位:
? ? 左邊用0填充,右邊丟棄
2. 算術(shù)移位:
? ? 左邊用原該值的符號位填充,右邊丟棄
如圖所示:
?警告? : 對于移位運(yùn)算符,不要移動負(fù)數(shù)位,這個(gè)是標(biāo)準(zhǔn)未定義的。
例如:?
int num=10
num>>-1;//error
num<<-1;//error
??位操作符?
&? ?按位與
|? ? 按位或
^? ?按位異或
注:他們的操作數(shù)必須是整數(shù)。
???按位與?&
對兩個(gè)操作數(shù)的每個(gè)對應(yīng)位執(zhí)行按位與操作,只有兩位都為1時(shí),結(jié)果為1,否則為0。
int a = 3;
int b = -5;
int c = a & b;//按(2進(jìn)制)位與
//c的結(jié)果為3
按位與&過程:
? ? 00000000000000000000000000000011 --- a的補(bǔ)碼
? ? 10000000000000000000000000000101 --- b的原碼
? ? 11111111111111111111111111111010? ? ? ? --- b的反碼? ? 11111111111111111111111111111011? ? ? ? ?--- b的補(bǔ)碼
?& 00000000000000000000000000000011 --- a的補(bǔ)碼
?---------------------------------------------------------------------
? ? ?00000000000000000000000000000011 --- c的補(bǔ)碼
? ? ?00000000000000000000000000000011 --- c的原碼 == 3
一個(gè)數(shù)&1可得該數(shù)二進(jìn)制最低位是0還是1?
int a = 3;
int b = -4;
int c = a&1;//結(jié)果為1
int d = b&1;//結(jié)果為0
過程:?
1、a&1
?? ?00000000000000000000000000000011 --- a的補(bǔ)碼
& 00000000000000000000000000000001 --- 1的補(bǔ)碼
?--------------------------------------------------------------
? ? 00000000000000000000000000000001 ---? c==a&1的補(bǔ)碼(原碼)-->?12、b&1
? ? 10000000000000000000000000000100?--- b的原碼
? ? 11111111111111111111111111111111100?--- b的補(bǔ)碼
?& 00000000000000000000000000000001?--- 1的補(bǔ)碼
---------------------------------------------------------------
? ? ?00000000000000000000000000000000--- d=b&1的補(bǔ)碼(原碼)-->0
???按位或?|
對兩個(gè)操作數(shù)的每個(gè)對應(yīng)位執(zhí)行按位或操作,只要對應(yīng)的兩位中有一個(gè)為1時(shí),結(jié)果為1,否則為0。
???按位異或?^
對兩個(gè)操作數(shù)的每個(gè)對應(yīng)位執(zhí)行按位異或操作,當(dāng)兩位不相同時(shí),結(jié)果為1,相同時(shí)為0。
int a = 3;
int b = -5;
int c = a ^ b;//結(jié)果為-8
異或^過程:?
? ?10000000000000000000000000000101 --- b的原碼
? ?11111111111111111111111111111010? ? ? ? ?--- b的反碼
? ?11111111111111111111111111111011? ? ? ? ?--- b的補(bǔ)碼
?^?00000000000000000000000000000011 --- a的補(bǔ)碼
-------------------------------------------------------------------
? ?11111111111111111111111111111000? ? ? ? ?--- c==a^b的補(bǔ)碼
? ?1000000000000000000000001000? ? ? ? ?--- c的原碼? --> -8
異或^的兩個(gè)特點(diǎn)
1. a ^ a = 0
2. 0 ^ a = a
??賦值操作符
賦值符號? =?
復(fù)合賦值符:+=? ? -=? ? *=? ? /=? ? %=? ? >>=? ? <<=? ? &=? ? |=? ? ^=
?賦值符號舉例:將右邊表達(dá)式的值賦給左邊的變量
int x; // 聲明一個(gè)整型變量x
x = 10; // 使用賦值操作符將10賦值給x
?復(fù)合賦值符舉例:
int x = 5;
x += 3; // 等同于 x = x + 3;
x *= 2; // 等同于 x = x * 2;
??單目操作符
單目運(yùn)算符(Unary operators)是一種只操作一個(gè)操作數(shù)(即單個(gè)值或變量)的運(yùn)算符。
!? ? ? ? ? ? ? ?邏輯反操作
-? ? ? ? ? ? ? ?負(fù)值
+? ? ? ? ? ? ??正值
&? ? ? ? ? ? ? 取地址
sizeof? ? ? 操作數(shù)的類型長度(以字節(jié)為單位)
~? ? ? ? ? ? ? 對一個(gè)數(shù)的二進(jìn)制按位取反
--? ? ? ? ? ? ? 前置、后置--
++? ? ? ? ? ? 前置、后置++
*? ? ? ? ? ? ? ?間接訪問操作符(解引用操作符)
(類型)? ? ???強(qiáng)制類型轉(zhuǎn)換
??邏輯反操作?!?
邏輯非運(yùn)算符 (!):用于將布爾值取反。
bool isTrue = true;
bool isFalse = !isTrue; // isFalse 等于 false
??(負(fù)值)-?(正值)+
負(fù)號運(yùn)算符 (-):將操作數(shù)的值取反。
正號運(yùn)算符 (+):將操作數(shù)的值保持不變(一般用于強(qiáng)調(diào)正數(shù)的正號,實(shí)際上不進(jìn)行任何操作)。
int x = -5; // x 等于 -5
int y = +10; // y 等于 10
??地址運(yùn)算符 &
地址運(yùn)算符 (&):用于獲取變量的內(nèi)存地址。
int num = 42;
int* ptr = # // ptr 指向變量 num 的內(nèi)存地址
??sizeof運(yùn)算符?
sizeof運(yùn)算符:用于獲取數(shù)據(jù)類型或表達(dá)式的字節(jié)大小。
int sizeOfInt = sizeof(int); // 獲取整型 int 的字節(jié)大小
???位取反運(yùn)算符 ~
位取反運(yùn)算符 (~):對操作數(shù)的每個(gè)位進(jìn)行取反操作。
int a = 5; // 二進(jìn)制表示為 000000000000000000000000000000101
int b = ~a; // 取反后為 111111111111111111111111111111010
//即十進(jìn)制 -6(取決于具體的位表示方式)
???遞減運(yùn)算符 --?
int x = 5;
int y = --x; // 先將 x 的值減少為 4,然后將 x 的值賦給 y,所以 x 和 y 都等于 4
int z = x--; // 先將 x 的值賦給 z(z = 4),然后將 x 的值減少為 3
??遞增運(yùn)算符 ++
遞增運(yùn)算符 (++):將操作數(shù)的值增加1。遞增運(yùn)算符也有前綴和后綴形式。
int a = 5;
int b = ++a; // 先將 a 的值增加為 6,然后將 a 的值賦給 b,所以 a 和 b 都等于 6
int c = a++; // 先將 a 的值賦給 c(c = 6),然后將 a 的值增加為 7
???間接尋址運(yùn)算符?*
間接尋址運(yùn)算符 (*):用于獲取指針指向的值。
int num = 42;
int* ptr = # // ptr 指向變量 num 的內(nèi)存地址
int value = *ptr; // value 等于 ptr 指向的值(即 42)
??強(qiáng)制類型轉(zhuǎn)換 (類型)
強(qiáng)制類型轉(zhuǎn)換:將操作數(shù)轉(zhuǎn)換為指定的類型。
float num = 3.14;
int intValue = (int)num; // 將浮點(diǎn)數(shù) num 轉(zhuǎn)換為整數(shù) intValue,結(jié)果為 3
??關(guān)系操作符
- 等于(==):檢查兩個(gè)操作數(shù)是否相等。
- 不等于(!=):檢查兩個(gè)操作數(shù)是否不相等。
- 大于(>):檢查左操作數(shù)是否大于右操作數(shù)。
- 小于(<):檢查左操作數(shù)是否小于右操作數(shù)。
- 大于等于(>=):檢查左操作數(shù)是否大于或等于右操作數(shù)。
- 小于等于(<=):檢查左操作數(shù)是否小于或等于右操作數(shù)。
關(guān)系運(yùn)算符用于比較兩個(gè)值之間的關(guān)系,并返回布爾值(true或false)。這些運(yùn)算符經(jīng)常在條件語句中使用,用于控制程序的執(zhí)行流程。關(guān)系運(yùn)算符可以幫助我們根據(jù)條件的真假執(zhí)行不同的代碼塊,使程序具備更強(qiáng)的邏輯性和靈活性。在使用關(guān)系運(yùn)算符時(shí),需要注意操作數(shù)的數(shù)據(jù)類型和語義,以避免出現(xiàn)意外結(jié)果或錯(cuò)誤。
警告: 在編程的過程中要注意== 和=的區(qū)別,不要寫錯(cuò),不然很容易導(dǎo)致程序錯(cuò)誤,=是用做賦值操作,而==才是用來判斷是否相等的。
??邏輯操作符
&&? ? ? ?邏輯與
|| ? ? ? ? ?邏輯或
區(qū)分邏輯與和按位與
區(qū)分邏輯或和按位或?
1&2 == 0 //按位與(二進(jìn)制)
1&&2 == 1 //邏輯與,只要有一個(gè)為假便為假
1|2 == 3 //按位或(二進(jìn)制)
1||2 == 1 //邏輯或,只要有一個(gè)為真便為真
邏輯與和或的特點(diǎn):短路
1.邏輯或
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;//----|| -- 左邊操作數(shù)如果為真,右邊無需計(jì)算
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
printf("i=%d\n", i);
return 0;
}
運(yùn)行結(jié)果:?
?2.邏輯與?
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;//------&& -- 左邊操作數(shù)如果為假,右邊無需計(jì)算
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
printf("i=%d\n", i);
return 0;
}
?運(yùn)行結(jié)果:
??條件操作符
exp1 ? exp2 : exp3
在條件運(yùn)算符?exp1 ? exp2 : exp3
?中,exp1
?是一個(gè)條件表達(dá)式,用于判斷條件是否為真。如果?exp1
?為真,那么整個(gè)條件運(yùn)算符的結(jié)果為?exp2
,否則為?exp3
。
例:
int num = 10;
string result = (num % 2 == 0) ? "偶數(shù)" : "奇數(shù)";
//如果 num 是偶數(shù),則條件 (num % 2 == 0) 為真,整個(gè)條件運(yùn)算符的結(jié)果為字符串 “偶數(shù)”;
//如果 num 是奇數(shù),則條件為假,結(jié)果為字符串 “奇數(shù)”。
??逗號表達(dá)式
逗號表達(dá)式,就是用逗號隔開的多個(gè)表達(dá)式。 逗號表達(dá)式,從左向右依次執(zhí)行。整個(gè)表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果。
//代碼1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//結(jié)果為13
//代碼2
if (a =b + 1, c=a / 2, d > 0)//if的判斷條件為 d > 0
//代碼3
a = get_val();
count_val(a);
while (a > 0) {
//業(yè)務(wù)處理
a = get_val();
count_val(a);
}
如果使用逗號表達(dá)式,改寫:
while (a = get_val(), count_val(a), a>0) {
//業(yè)務(wù)處理
a = get_val();
count_val(a);
}
??下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
??下標(biāo)引用操作符?[ ]
?兩個(gè)操作數(shù):數(shù)組名 + 索引值
int arr[10];//創(chuàng)建數(shù)組
arr[9] = 10;//實(shí)用下標(biāo)引用操作符。
//[ ]的兩個(gè)操作數(shù)是arr和9
???函數(shù)調(diào)用操作符 ()
?接受一個(gè)或者多個(gè)操作數(shù):第一個(gè)操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)。
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //使用()作為函數(shù)調(diào)用操作符。
test2("hello world.");//使用()作為函數(shù)調(diào)用操作符。
return 0;
}
??訪問一個(gè)結(jié)構(gòu)的成員? . or ->
.? ? ? 結(jié)構(gòu)體 . 成員名
->? ? 結(jié)構(gòu)體指針 -> 成員名
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score;
};
void set_age1(struct Stu stu)
{
stu.age = 18;
}
void set_age2(struct Stu* pStu)
{
pStu->age = 18;//結(jié)構(gòu)成員訪問
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//結(jié)構(gòu)成員訪問
stu.age = 20;//結(jié)構(gòu)成員訪問
set_age1(stu);
pStu->age = 20;//結(jié)構(gòu)成員訪問
set_age2(pStu);
return 0;
}
??C語言運(yùn)算符優(yōu)先級表?
??今天的分享就到這里,如果覺得博主的文章還不錯(cuò)的話,請??三連支持一下博主哦????文章來源:http://www.zghlxwxcb.cn/news/detail-624729.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-624729.html
到了這里,關(guān)于【C語言】操作符----詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!