C語(yǔ)言全面細(xì)致精講操作符的使用
前言
本次文章我們要講各種操作符的介紹,內(nèi)容非常詳細(xì),大家拭目以待哦!
首先介紹操作符的種類
操作符分類:
- 算術(shù)操作符
- 移位操作符
- 位操作符
- 賦值操作符
- 單目操作符
- 關(guān)系操作符
- 邏輯操作符
- 條件操作符
- 逗號(hào)表達(dá)式
- 下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
一、算術(shù)操作符
+ - * / %
- 除了 % 操作符之外,其他的幾個(gè)操作符可以作用于整數(shù)和浮點(diǎn)數(shù)。
- 對(duì)于 / 操作符如果兩個(gè)操作數(shù)都為整數(shù),執(zhí)行整數(shù)除法。而只要有浮點(diǎn)數(shù)執(zhí)行的就是浮點(diǎn)數(shù)除法。
- % 操作符的兩個(gè)操作數(shù)必須為整數(shù)。返回的是整除之后的余數(shù)。
二、移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作數(shù)只能是整數(shù)。
1.左移操作符
移位規(guī)則:左邊拋棄、右邊補(bǔ)0
//10 下面是在二進(jìn)制中那個(gè)的表示形式
//0000000000000000000000000000000000001010
//左移一位
//0000000000000000000000000000000000010100
2.右移操作符
移位規(guī)則:
首先右移運(yùn)算分兩種:
1.邏輯移位
左邊用0填充,右邊丟棄
2.算術(shù)移位
左邊用原該值的符號(hào)位填充,右邊丟棄
//我們假設(shè)用-1來(lái)舉例子
//-1在二進(jìn)制中表示為32個(gè)1
//11111111111111111111111111111111
//邏輯右移
//01111111111111111111111111111111
//算術(shù)右移
//11111111111111111111111111111111
警告 :
對(duì)于移位運(yùn)算符,不要移動(dòng)負(fù)數(shù)位,這個(gè)是標(biāo)準(zhǔn)未定義的。
例如:
int num = 10; num>>-1;//error
三、位操作符
位操作符有:
& //按位與
| //按位或
^ //按位異或
注:他們的操作數(shù)必須是整數(shù)。
練習(xí)一下:
int main() {
//& 按(2進(jìn)制)位與
//| 按(2進(jìn)制)位或
//^ 按(2進(jìn)制)位異或
int a = 3;
int b = -5;
int c = a & b;
//00000000 00000000 00000000 00000011 3的補(bǔ)碼
//10000000 00000000 00000000 00000101 -5 原碼
//11111111 11111111 11111111 11111010 反碼
//11111111 11111111 11111111 11111011 補(bǔ)碼
//00000000 00000000 00000000 00000011 3的補(bǔ)碼
//00000000 00000000 00000000 00000011 //按位與 全1為1 其他位0
printf("%d\n", c);
int d = a | b;
//11111111 11111111 11111111 11111011 補(bǔ)碼
//00000000 00000000 00000000 00000011 3的補(bǔ)碼
//11111111 11111111 11111111 11111011 補(bǔ)碼
//10000000 00000000 00000000 00000100
//10000000 00000000 00000000 00000101
printf("%d\n", d);
int e = a ^ b;
//11111111 11111111 11111111 11111011 補(bǔ)碼
//00000000 00000000 00000000 00000011 3的補(bǔ)碼
//11111111 11111111 11111111 11111000
//10000000 00000000 00000000 00000111
//10000000 00000000 00000000 00001000
printf("%d\n", e);
return 0;
}
一道變態(tài)的面試題:
不能創(chuàng)建臨時(shí)變量(第三個(gè)變量),實(shí)現(xiàn)兩個(gè)數(shù)的交換
int main() {
int a = 3;
int b = 5;
//printf("交換前a=%d,b=%d\n",a,b);
方法一
//a = a + b;
//b = a - b;
//a = a - b;
//printf("交換前a=%d,b=%d\n", a, b);
printf("交換前a=%d,b=%d\n", a, b);
//方法二
a = a ^ b;//3^5
b = a ^ b;//3^5^5=3
a = a ^ b;//3^5^3=5
printf("交換后a=%d,b=%d\n", a, b);
return 0;
}

練習(xí):
編寫代碼實(shí)現(xiàn):求一個(gè)整數(shù)存儲(chǔ)在內(nèi)存中的二進(jìn)制中1的個(gè)數(shù)。
int main() {
int m = 15;
int i = 0;
int count = 0;
while (i < 32)
{
if (((m >> i) & 1) == 1)
count++;
i++;
}
printf("count:%d\n",count);
return 0;
}
分別用每一位與1
這一位是1運(yùn)算后的結(jié)果就是1
四、賦值操作符
賦值操作符是一個(gè)很棒的操作符,他可以讓你得到一個(gè)你之前不滿意的值。也就是你可以給自己重新賦值
int weight = 120;//體重
weight = 89;//不滿意就賦值
double salary = 10000.0;
salary = 20000.0;//使用賦值操作符賦值。
賦值操作符可以連續(xù)使用,比如:
int a = 10;
int x = 0;
int y = 20; a = x = y+1;//連續(xù)賦值
這樣的代碼感覺怎么樣?
那同樣的語(yǔ)義,你看看:
x = y+1; a = x;
這樣的寫法是不是更加清晰爽朗而且易于調(diào)試。
復(fù)合賦值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
這些運(yùn)算符都可以寫成復(fù)合的效果。
比如:
int x = 10; x = x+10; x += 10;//復(fù)合賦值 //其他運(yùn)算符一樣的道理。這樣寫更加簡(jiǎn)潔。
五、單目操作符
單目操作符介紹
! 邏輯反操作
- 負(fù)值
+ 正值
& 取地址
sizeof 操作數(shù)的類型長(zhǎng)度(以字節(jié)為單位)
~ 對(duì)一個(gè)數(shù)的二進(jìn)制按位取反
-- 前置、后置--
++ 前置、后置++
* 間接訪問操作符(解引用操作符) (類型) 強(qiáng)制類型轉(zhuǎn)換
演示代碼:
#include <stdio.h>
int main()
{
int a = -10;
int *p = NULL;
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);//這樣寫行不行?
printf("%d\n", sizeof int);//這樣寫行不行?//結(jié)果是不行
//其實(shí)我們從這里就可以看出sizeof不是一個(gè)函數(shù)
return 0;
}關(guān)于sizeof其實(shí)我們之前已經(jīng)見過了,可以求變量(類型)所占空間的大小。
1.sizeof 和 數(shù)組
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)//這里是指針,因?yàn)閭鬟^來(lái)的是地址要拿指針接收 在32為機(jī)器下 字節(jié)為4
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)//同理//這里是指針,因?yàn)閭鬟^來(lái)的是地址要拿指針接收 在32為機(jī)器下 字節(jié)為4
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1)//40
printf("%d\n", sizeof(ch));//(3)//10
test1(arr);
test2(ch);
return 0;
}問:
(1)、(2)兩個(gè)地方分別輸出多少?
(3)、(4)兩個(gè)地方分別輸出多少?
2.++和–運(yùn)算符
//前置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = ++a;
//先對(duì)a進(jìn)行自增,然后對(duì)使用a,也就是表達(dá)式的值是a自增之后的值。x為11。
int y = --a;
//先對(duì)a進(jìn)行自減,然后對(duì)使用a,也就是表達(dá)式的值是a自減之后的值。y為10;
return 0;
}//后置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = a++;
//先對(duì)a先使用,再增加,這樣x的值是10;之后a變成11;
int y = a--;
//先對(duì)a先使用,再自減,這樣y的值是11;之后a變成10;
return 0; }六、關(guān)系操作符
關(guān)系操作符
>
>=
<
<=
!= 用于測(cè)試“不相等”
== 用于測(cè)試“相等”
這些關(guān)系運(yùn)算符比較簡(jiǎn)單,沒什么可講的,但是我們要注意一些運(yùn)算符使用時(shí)候的陷阱。
警告:
在編程的過程中== 和=不小心寫錯(cuò),導(dǎo)致的錯(cuò)誤。
七、邏輯操作符
邏輯操作符有哪些:
&& 邏輯與
|| 邏輯或
區(qū)分邏輯與和按位與
區(qū)分邏輯或和按位或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
接下來(lái)我們引入一道360的面試題
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0; }
//程序輸出的結(jié)果是什么?

這里邏輯且運(yùn)算碰到錯(cuò)誤直接結(jié)束,后面的運(yùn)算就不再繼續(xù)
而邏輯或運(yùn)算碰到正確直接結(jié)束,后面的運(yùn)算就不再繼續(xù)
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
//程序輸出的結(jié)果是什么?
八、條件操作符
exp1 ? exp2 : exp3
練習(xí):
1.
if (a > 5)
b = 3;
else
b = -3;
轉(zhuǎn)換成條件表達(dá)式,是什么樣?
2.使用條件表達(dá)式實(shí)現(xiàn)找兩個(gè)數(shù)中較大值
return a>b?a:b;
九、逗號(hào)表達(dá)式
exp1, exp2, exp3, …expn
逗號(hào)表達(dá)式,就是用逗號(hào)隔開的多個(gè)表達(dá)式。
逗號(hào)表達(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);//逗號(hào)表達(dá)式
// c是多少?
//代碼2
if (a =b + 1, c=a / 2, d > 0)
//代碼3
a = get_val();
count_val(a);
while (a > 0) {
//業(yè)務(wù)處理
a = get_val();
count_val(a);
}
//如果使用逗號(hào)表達(dá)式,改寫:
while (a = get_val(), count_val(a), a>0) {
//業(yè)務(wù)處理
}
提示
這里一定要計(jì)算前面的值,可能會(huì)對(duì)最后一個(gè)表達(dá)式進(jìn)行影響
十、下標(biāo)引用與函數(shù)調(diào)用和結(jié)構(gòu)成員
1. []下標(biāo)引用操作符
操作數(shù):
一個(gè)數(shù)組名 + 一個(gè)索引值
int arr[10];//創(chuàng)建數(shù)組 arr[9] = 10;//實(shí)用下標(biāo)引用操作符。 // [ ]的兩個(gè)操作數(shù)是arr和9。 //也可以這樣 [9]arr=10; //但是不建議這樣,代碼看起來(lái)不直觀
2. ()函數(shù)調(diào)用操作符
接受一個(gè)或者多個(gè)操作數(shù):第一個(gè)操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)。
#include <stdio.h>
void test1()
{
printf("hello\n");
}
void test2(char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //實(shí)用()作為函數(shù)調(diào)用操作符。
test2("hello world.");//實(shí)用()作為函數(shù)調(diào)用操作符。
return 0;
}3. 訪問一個(gè)結(jié)構(gòu)的成員
. 結(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;
}到此這篇關(guān)于C語(yǔ)言全面細(xì)致精講操作符的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言操作符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?電話號(hào)碼的字母組合功能實(shí)現(xiàn)
這篇文章主要介紹了C++?電話號(hào)碼的字母組合,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
深入理解C++中的new/delete和malloc/free動(dòng)態(tài)內(nèi)存管理及區(qū)別介紹
這篇文章主要介紹了深入理解C++中的new/delete和malloc/free動(dòng)態(tài)內(nèi)存管理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運(yùn)算符重載的實(shí)現(xiàn)
本文主要為大家講解一下三個(gè)C++中的運(yùn)算符重載,分別是賦值運(yùn)算符重載、關(guān)系運(yùn)算符重載和函數(shù)調(diào)用運(yùn)算符重載,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06
C++?ffmpeg實(shí)現(xiàn)將視頻幀轉(zhuǎn)換成jpg或png等圖片
有時(shí)播放實(shí)時(shí)流的時(shí)候有截圖的需求,需要將解碼出來(lái)的圖片保存本地或上傳服務(wù)器,這時(shí)就需要將avframe中的數(shù)據(jù)編碼成png、jpg等格式的圖片,我們使用ffmpeg的相關(guān)編碼器就可以實(shí)現(xiàn)功能,下面就來(lái)講講具體實(shí)現(xiàn)方法吧2023-03-03
C++多態(tài)與虛擬之C++編譯器對(duì)函數(shù)名的改編(Name?Mangling)
在Windows?DLLs中,使用C++編寫的DllMain()等callback函數(shù)需避免C++編譯器進(jìn)行name?mangling,因此需使用extern?"C",這篇文章主要介紹了C++多態(tài)與虛擬:C++編譯器對(duì)函數(shù)名的改編(Name?Mangling),需要的朋友可以參考下2024-04-04
C++?二叉樹的實(shí)現(xiàn)超詳細(xì)解析
二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-03-03
解析C++中構(gòu)造函數(shù)的默認(rèn)參數(shù)和構(gòu)造函數(shù)的重載
這篇文章主要介紹了解析C++中構(gòu)造函數(shù)的默認(rèn)參數(shù)和構(gòu)造函數(shù)的重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09

