??博客主頁(yè): 小羊失眠啦.
??系列專欄: C語(yǔ)言
???每日語(yǔ)錄:業(yè)精于勤,荒于嬉。
??感謝大家點(diǎn)贊??收藏?評(píng)論??
前言
今天小羊又來(lái)為鐵汁們更新C語(yǔ)言初階的操作符詳解,我們?cè)谄綍r(shí)寫代碼時(shí)總會(huì)寫到一些算術(shù)操作符和賦值操作符,可是當(dāng)鐵汁們遇到其他的操作符時(shí),就會(huì)望而卻步,甚至寫出一些bug,所以這期我給鐵汁們帶來(lái)新鮮出爐的操作符詳解~
操作符分類
算術(shù)操作符
移位操作符
位操作符
賦值操作符
單目操作符
關(guān)系操作符
邏輯操作符
條件操作符
逗號(hào)表達(dá)式
下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
算術(shù)操作符
算術(shù)操作符是最常見的:
+ | - | * | / | % |
---|
注意:
- 除%操作符之外,其他的算術(shù)操作符都可以作用于整數(shù)和浮點(diǎn)數(shù)
- 使用/操作符時(shí),如果兩個(gè)操作符都為整數(shù),則執(zhí)行整數(shù)除法,結(jié)果為整數(shù)。若其中有一個(gè)為浮點(diǎn)數(shù),則執(zhí)行浮點(diǎn)數(shù)除法,結(jié)果為浮點(diǎn)數(shù)。
- %操作符的兩個(gè)操作數(shù)必須為整數(shù)
分析示例1
#include<stdio.h>
int main()
{
int a = 4, b = 0;
int c = a / b;
printf("%d", c);
return 0;
}
分析:/操作符的除數(shù)不能為0,否則編譯器會(huì)報(bào)錯(cuò),就跟數(shù)學(xué)中分?jǐn)?shù)中的分母不能0是一個(gè)道理。
分析示例2
#include<stdio.h>
int main()
{
int a = 8, b = 3;
int c = a / b;
int d = a % b;
printf("c=%d\n", c);
printf("d=%d\n", d);
return 0;
}
分析:C語(yǔ)言中的/操作符結(jié)果只保留整數(shù)部分(8/3=2……3),而%操作符是保留余數(shù)部分。
移位操作符
<<(左移操作符) | >>(右移操作符) |
---|
注:移位操作符的操作數(shù)只能是整數(shù)
移位操作符的作用是什么呢?這里的“位”是指二進(jìn)制位,故移位操作符是指移動(dòng)一個(gè)數(shù)的二進(jìn)制位。并且我們得清楚一個(gè)概念:整數(shù)在內(nèi)存中存儲(chǔ)的是二進(jìn)制的補(bǔ)碼,所以移動(dòng)的是這個(gè)數(shù)的補(bǔ)碼的二進(jìn)制位。
二進(jìn)制的三種形式:
- 原碼:二進(jìn)制展開
- 反碼:原碼的符號(hào)位不變,其他位按位取反(最高位是符號(hào)位:正數(shù)的符號(hào)位為0,負(fù)數(shù)的符號(hào)位為1)
- 補(bǔ)碼:反碼加1
注:正整數(shù)的原碼、反碼、補(bǔ)碼相同
左移操作符
定義:即操作數(shù)的二進(jìn)制位向左移動(dòng)
移位規(guī)則:
左邊拋棄、右邊補(bǔ)0
圖法示例:
總結(jié):左移有翻倍的效果,左移一位的結(jié)果是原來(lái)的兩倍,左移兩位是原來(lái)的四倍。
注:num左移后,num本身的值并沒(méi)有改變,因?yàn)橐莆徊僮鞣⒉痪哂兄匦沦x值的功能,若是移位之后再賦值給自己,num的值才會(huì)發(fā)生改變。
右移操作符
定義:即操作數(shù)的二進(jìn)制位向右移動(dòng)
移位規(guī)則:
-
邏輯移位
:
左邊用0填充,右邊丟棄 -
算術(shù)移位
:
左邊用原該值的符號(hào)位填充,右邊丟棄
圖法示例
總結(jié):右移一位會(huì)減少到原來(lái)的二分之一,右移兩位會(huì)減少到原來(lái)的四分之一。
注:
- 對(duì)于移位運(yùn)算符,不能移動(dòng)
負(fù)數(shù)位
,這個(gè)是標(biāo)準(zhǔn)未定義的。 - 無(wú)論左移還是右移,
移動(dòng)的位數(shù)不要太多
,比如總共32位,若是移動(dòng)33位,無(wú)法得知
位操作符
&(按位與) | 丨(按位或) | ^(按位異或) |
---|---|---|
左右操作數(shù)都為真才為真,否則都為假 | 只要一邊為真,則為真 | 相同為假,相異為真 |
注:在二進(jìn)制中1為真,0為假,他們的操作數(shù)必須是整數(shù),使用對(duì)象為內(nèi)存中二進(jìn)制的補(bǔ)碼
用法示例
#include <stdio.h>
int main()
{
int x = 66, y = 34;
int a = x & y;
int b = x | y;
int c = x ^ y;
printf("a=%d\nb=%d\nc=%d", a, b, c);
return 0;
}
運(yùn)行結(jié)果:
小試牛刀
不能創(chuàng)建臨時(shí)變量(第三個(gè)變量),實(shí)現(xiàn)兩個(gè)數(shù)的交換。
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
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);
return 0;
}
這里采用的思想就是0 ^ a = a、a ^ a = 0
a = a ^ b ,將a帶入b = a ^ b中,就得到了b = a ^ b ^ b=a,將b帶入a = a^b中,就得到了a=a ^ a ^ b= b,因此就可以將兩個(gè)數(shù)實(shí)現(xiàn)交換。
賦值操作符
賦值操作符是最最常用的操作符,它可以讓你得到你想得到的任意的值。
int a=10;
double b=9.0;
char c='a';
a =4;
b=9.7;
c='t';
復(fù)合賦值符
a +=b | a -= b | a *= b | a /= b | a %= b | a >>= b | a <<= b | a &= b | a丨= b | a ^ = b |
---|---|---|---|---|---|---|---|---|---|
a=a+b | a=a-b | a=a*b | a=a/b | a=a%b | a=a>>b | a=a<<b | a=a&b | a=a丨b | a=a^b |
單目操作符
! | - | + | & | sizeof | ~ | - - | ++ | * | (類型) |
---|---|---|---|---|---|---|---|---|---|
邏輯反操作 | 負(fù)值 | 正值 | 取地址 | 操作數(shù)的類型長(zhǎng)度(以字節(jié)為單位) | 對(duì)一個(gè)數(shù)的二進(jìn)制按位取反 | 前置、后置– | 前置、后置++ | 間接訪問(wèn)操作符(解引用操作符) | 強(qiáng)制類型轉(zhuǎn)換 |
!0=1,!1=0 | 略 | 略 | 取出變量地址 | ↓下文詳解 | 對(duì)一個(gè)數(shù)二進(jìn)制按位取反,~101011=010100 | ↓下文詳解 | ↓下文詳解 | 見指針章詳解 | ↓下文詳解 |
(類型)強(qiáng)制類型轉(zhuǎn)換:
int n=10;
float m=2.0f;
m=(float)n;
sizeof和數(shù)組
sizrof()是一個(gè)操作符,用于計(jì)算操作數(shù)占空間大小,單位是字節(jié)。
可以以類型、指針和函數(shù)等作為參數(shù)。
分析示例
#include<stdio.h>
void test1(int arr1[])
{
printf("\n%d\n", sizeof(arr1));
}
void test2(char arr2[])
{
printf("%d\n", sizeof(arr2));
}
void test3(float arr3[])
{
printf("%d\n", sizeof(arr3));
}
void test4(double arr4[])
{
printf("%d\n", sizeof(arr4));
}
int main()
{
int a = 0;
float b = 0.0f;
double c = 0.00f;
long long d = 12345;
int arr1[10] = { 0 };
char arr2[10] = { 0 };
float arr3[10] = { 0 };
double arr4[10] = { 0 };
//計(jì)算變量大小
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(b));
printf("%d\n", sizeof(c));
printf("%d\n", sizeof(d));
//計(jì)算類型大小
printf("\n%d\n", sizeof(int));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long long));
//計(jì)算數(shù)組大小
printf("\n%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
printf("%d\n", sizeof(arr3));
printf("%d\n", sizeof(arr4));
//計(jì)算地址大小
test1(arr1);
test2(arr2);
test3(arr3);
test4(arr4);
return 0;
}
分析:
在數(shù)組傳參時(shí),傳遞的是數(shù)組的首地址,從而計(jì)算的是地址的大小
計(jì)算地址大小有兩種結(jié)果:在32位機(jī)器上是4字節(jié),在64位機(jī)器上是8字節(jié)
前置++與后置++
前置++:操作數(shù)先自增1,后再被使用(先++再使用)
后置++:操作數(shù)先被使用,后再自增1(先使用再++)
#include <stdio.h>
int main()
{
int a = 5, c = 0;
//前置++
c = ++a;//先a自增1使得a的值變?yōu)?,然后再被賦值到c.
printf("%d\n", c);//6
printf("%d\n", a);//6
//后置++
a = 5, c = 0;
c = a++;//先使a被賦值到c,此時(shí)a=5,賦值完成后,a再自增1,變?yōu)?.
printf("%d\n", c);//5
printf("%d\n", a);//6
return 0;
}
前置- -與后置- -效果相同
關(guān)系操作符
> | >= | < | <= | != | == |
---|---|---|---|---|---|
用于測(cè)試”不相等“ | 用于測(cè)試“相等 |
關(guān)系操作符的返回結(jié)果只有真或假
常見錯(cuò)誤:
在實(shí)際編程中,關(guān)系運(yùn)算符= =不能和=搞混
,導(dǎo)致錯(cuò)誤
邏輯操作符
&& | 丨丨 |
---|---|
邏輯與 (并且) | 邏輯或(或者) |
用法示例
#include <stdio.h>
int main()
{
int i = 0, m = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
m = a++||++b||d++;
printf("\na = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
分析:
&&和||有一個(gè)重要的特點(diǎn):當(dāng)?shù)谝粋€(gè)表達(dá)式已經(jīng)能確定整條語(yǔ)句的結(jié)果時(shí),后面剩余的表達(dá)式將不會(huì)執(zhí)行。
上例中:
- a++ && ++b && d++,咱們先看a++,先使用a再++,而a為0,0為假,所以無(wú)論后面的表達(dá)式是真是假,語(yǔ)句的整體結(jié)果都為假。所以執(zhí)行完a++后,++b和d++不再執(zhí)行。
”假“&&”任意“為”假“
- a++||++b||d++,咱們先看a++,先使用a再++,a=1后自增1,a=2,2為真,所以后面++b和d++也不用再執(zhí)行。
”真“||”任意“為”真“
條件操作符
exp1 ? exp2 : exp3 ; |
---|
執(zhí)行邏輯:當(dāng)表達(dá)式1的結(jié)果為真,則執(zhí)行表達(dá)式2,否則就執(zhí)行表達(dá)式3
用法示例
當(dāng)我們比較兩個(gè)數(shù)的大小時(shí),通常會(huì)想到使用if語(yǔ)句來(lái)解決:
#include <stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d%d", &a, &b);
if (a > b)
{
printf("Max is %d", a);
}
else printf("Max is %d", b);
return 0;
}
而現(xiàn)在我們可以轉(zhuǎn)換為更為簡(jiǎn)單的寫法:
#include <stdio.h>
int main()
{
int a = 0, b = 0,c = 0;
scanf("%d%d", &a, &b);
c = a > b ? a : b;
printf("Max is %d", c);
return 0;
}
逗號(hào)表達(dá)式
exp1 , exp2 , exp3,… |
---|
逗號(hào)表達(dá)式就是用逗號(hào)隔開的多個(gè)表達(dá)式
運(yùn)算規(guī)則:
從左向右依次執(zhí)行,整個(gè)表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果。
用法示例
#include <stdio.h>
int main()
{
int m = 0, a = 1, b = 2, c = 3, d = 5;
m = (a++, b + 2, c *=2, c + d);
printf("m=%d\n", m);
printf("a=%d,b=%d,c=%d,d=%d", a, b, c, d);
return 0;
}
逗號(hào)表達(dá)式運(yùn)用的場(chǎng)景不是很多,但是能靈活運(yùn)用也有很多妙處。
下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
下標(biāo)引用操作符
使用方法:數(shù)組名[操作數(shù)]
具體見C語(yǔ)言之?dāng)?shù)組
函數(shù)調(diào)用操作符
接受一個(gè)或者多個(gè)操作數(shù):第一個(gè)操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)。
使用方法:函數(shù)名(參數(shù)1,參數(shù)2......)
int sum(int x,int y);
void test1(const char* str);
結(jié)構(gòu)體成員訪問(wèn)操作符
.結(jié)構(gòu)體 .成員名
->結(jié)構(gòu)體指針->成員名文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-620222.html
#include<stdio.h>
struct Stu
{
char name[10];
char sex[5];
int age;
double stature;
};
#include <stdio.h>
int main()
{
struct Stu s1 = { "jonny","男","19",1.79 };
printf("姓名:%s\n", s1.name);
struct Stu* s = &s1;
printf("性別:%s\n", s->sex);
s->stature = 1.88;
printf("身高:%.3lf", s->stature);
return 0;
}
好勒,今天小羊這期C語(yǔ)言初階的操作符詳解大致講解完畢,剩余一小部分會(huì)在后面的文章中見~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-620222.html
到了這里,關(guān)于『C語(yǔ)言初階』第六章-操作符詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!