目錄
前言:
1.賦值操作符
2.單目操作符
2.1取地址操作符
2.2sizeof操作符
2.3++和--
3.關(guān)系操作符
4.條件表達(dá)式和逗號表達(dá)式
4.1條件表達(dá)式
4.2逗號表達(dá)式
5.下標(biāo)引用&函數(shù)調(diào)用&結(jié)構(gòu)訪問
6.表達(dá)式與語句的關(guān)系
?博主CSDN:啊蘇要學(xué)習(xí)
? ?專欄分類:C語言?
? C語言的學(xué)習(xí),是為我們今后學(xué)習(xí)其它語言打好基礎(chǔ),C生萬物!
? 開始我們的C語言之旅吧!?
前言:
? 緊接上一篇,仍舊是來講解操作符的使用。
? 鏈接:操作符講解1---C語言???????
1.賦值操作符
? 賦值操作符是用來為變量進(jìn)行賦值操作的(內(nèi)存空間里放值),分為簡單賦值操作符和復(fù)合賦值操作符。
- 簡單賦值操作符:=
int main()
{
int a = 10;
a = 20;//這里的等號就是賦值操作符
return 0;
}
? 賦值可以讓我們改變變量里我們原先不想要的值,把我們理想的值放到變量里面去。
- 復(fù)合賦值操作符:+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=。
? 正是因為有上面這些賦值操作符,才將=與上面這些賦值符劃分為簡單和復(fù)合類型。那么我們來認(rèn)識和使用復(fù)合賦值操作符。
? 我們看a那一行代碼,a本身加上10再賦值給a本身。屏幕上a和b的打印出來的值都是20,這說明+=這個復(fù)合賦值符是將一個數(shù)與b相加,再賦值給b。是的,所有的復(fù)合賦值操作符都是一個能進(jìn)行運算的操作符配合簡單賦值操作符,結(jié)合起來的先運算再賦值的形式。
2.單目操作符
? 單目操作符有:!、+、-、sizeof、~、&、*、--、++、(強(qiáng)制類型轉(zhuǎn)換)
? 單目操作符的概念是,這個操作符的操作數(shù)只有一個(只對一個數(shù)據(jù)進(jìn)行操作)。
??!的操作數(shù)只有一個,它也是邏輯操作符,在上一篇我們講過了,加上無非就是從真變假,從假變真的效果。
? +(正號),這里不是加號的意思,而是正號。加號是雙目操作符,一個正數(shù)前面寫上+是沒問題的,不過簡直是多一舉罷了,我們一般都不會用到這個操作符來表示正數(shù)。
? -(符號),這個操作符能將正數(shù)變成負(fù)數(shù),負(fù)數(shù)變成正數(shù)。比如int a = 1; a = -a; a的值被賦成了-1。
2.1取地址操作符
? &(取地址操作符),由于我們在創(chuàng)建變量的時候,會向操作系統(tǒng)申請空間,也就是借用內(nèi)存單元給我們使用,這些內(nèi)存單元都有編號,為了取得這些編號,C語言用&取地址操作符取出變量所在的內(nèi)存單元編號。
? &取地變量址的時候,我們以上面的例子為例吧。在這個代碼樣例中,一個整型所占空間的大小是4個字節(jié),由于每個內(nèi)存單元的大小是1個字節(jié),所以一個整型占了4個內(nèi)存單元,而且每一個內(nèi)存單元都有它自己的地址,那我們?nèi)∵@個整型的地址的時候,取得是哪個內(nèi)存單元的地址呢?
? 答案是:這個變量起始位置的內(nèi)存單元地址。這是因為,當(dāng)我們標(biāo)明了這個變量的數(shù)據(jù)類型時,我們只需要記住這個變量從哪里開始,編譯器會自動根據(jù)數(shù)據(jù)的類型,往后訪問相應(yīng)大小的內(nèi)存單元空間。
2.2sizeof操作符
? 大家可能在沒完全了解sizeof的時候,就在用sizeof了。和大家對sizeof的認(rèn)識一樣,它是用來求變量或數(shù)據(jù)類型所占用內(nèi)存單元的多少的,單位是字節(jié),比如int占用4個字節(jié),那用sizeof來求int創(chuàng)建的變量的時候,結(jié)果是4。
? 也許你會覺得,sizeof()這樣子很像是一個函數(shù)調(diào)用,實際上不是的,我們看下面的代碼:
? 這里我改了一下,把變量名括起來的括號給去掉了,然后結(jié)果還是正確的,如果sizeof是函數(shù)的話,調(diào)用函數(shù)的時候()(函數(shù)調(diào)用操作符),是不能省略的。?可能細(xì)心的小伙伴會發(fā)現(xiàn),博主博主,你為什么括起類型的括號不去掉呢?哈哈,其實是不行的,去掉的話,編譯器會報錯。
? 因為int這些數(shù)據(jù)類型本身就是C語言中的關(guān)鍵字,如果不用()將其束縛起來,讓它明顯地作為sizeof操作符的操作數(shù),編譯器的理解將會是:這里憑空出現(xiàn)了一個int關(guān)鍵字,又沒有聲明變量等等原因,我只處理唯一性的指令。總之就是這個有歧義,編譯器無法幫我們處理就對了。
? 總結(jié):所以sizeof本質(zhì)上是一個操作符,用來求數(shù)據(jù)類型或變量所占空間的大小,單位是字節(jié),求類型時,括號不能省略。
? ~波浪號的作用是,二進(jìn)制位取反。它不像整型從原碼變到反碼時,符號位不變其它位按位取反;也不是!感嘆號對結(jié)果取反;而是對二進(jìn)制位全部位取反。比如:
? 補(bǔ)充:表達(dá)式求值的時候,其實不會對變量本身造成影響。可以這樣理解,我們在用到變量名,實際上是把變量名控制的這塊內(nèi)存空間里的數(shù)值拷貝一份供別人去使用,不管別人怎么使用,不會影響到我變量本身。我們稱這種情況為:沒有副作用。但我們下面講的操作符就有副作用了,它們會改變變量內(nèi)存空間里的值。
2.3++和--
? ++和--操作符,這兩個操作符講一個,另一個就明白了。
? ++在變量的后面,是后置++,看到控制臺上的結(jié)果是,b的值為5,a的值為6。這說明,a++賦值給b的時候,用的是5賦值給b,隨后a自己加了個1,打印a的時候打印出來6。
? 后置++或--的特點是,使用變量原來的值進(jìn)行表達(dá)式運算,然后變量自己再加1或減1,叫做先使用后調(diào)整。先使用值,后面再調(diào)整自身。
? 前置++或--:
? 前置的++是先調(diào)整自身變成6,再使用賦值給b為6,叫做先調(diào)整后使用。
? 前置--和后置--也是一樣的道理,這里就不再贅述了。
練習(xí):
? *(間接訪問操作符)解引用操作符,這個符號用于對指針進(jìn)行解應(yīng)用操作,這里簡單提及一下*的用法。
? 這里我們首先創(chuàng)建一個a變量,輸入一個520,然后將a變量的地址取出來放到整型指針變量pa里,*pa進(jìn)行的操作是:找到pa里存放的值它相對應(yīng)的內(nèi)存單元的編號空間。也就是pa里的值是a變量的地址,*pa通過地址找到a變量,*pa等價于a。具有意義的5.20近在咫尺,博主沒有女朋友,可以多更新幾篇,用博文為身為情侶的你們送上祝福~ 哈哈。
? (數(shù)據(jù)類型)是一個強(qiáng)制轉(zhuǎn)換的操作符,它可以把原先屬于整型的數(shù)據(jù)轉(zhuǎn)換成浮點型,是C語言比較霸道的解決類型不兼容(不同數(shù)據(jù)之間進(jìn)行運算會有不兼容的警告)的方法,因為是霸道的操作符,所以還是有一點破壞的,比如數(shù)據(jù)可能會丟失之類的,所以數(shù)據(jù)類型能寫對就寫對,到一些需要用的場所就用。
? 整型沒有小數(shù),所以強(qiáng)制轉(zhuǎn)換成整數(shù)打印,會把小數(shù)部分去掉。
3.關(guān)系操作符
? 關(guān)系操作符有:>,<,>=,<=,==,!=
? 關(guān)系操作符主要用在測試條件(選擇,循環(huán)的判斷部分),如果表達(dá)式是對的,那結(jié)果為真,反之為否。注意的一點是,計算機(jī)中大于等于和小于等于的寫法不像數(shù)學(xué)那樣。
? ==用來判斷相等,千萬不要在寫判斷條件的時候把兩個等號寫成了一個,那樣是賦值而不是判斷相等。!=用來判斷不相等。
#include <stdio.h>
int main()
{
int a = 0;
if(a = 0)
{
printf("haha\n");
}
return 0;
}
? 這道編程會不會打印haha?答案是不會的,因為這里不是判斷,a是否等于0,而是將0賦值給了a,這個賦值表達(dá)式的結(jié)果是0,在測試條件部分,0為假,所以不會打印。
#include <stdio.h>
int main()
{
int a = 0;
if(0 = a)
{
printf("haha\n");
}
return 0;
}
? 這種寫法呢?如果我們運行起來,編譯器會報錯,因為我們把a(bǔ)賦值給了0,0是常量。第一種寫法往往會讓我們得到意向不到的結(jié)果,而且我們不知道錯在哪里,需要去調(diào)試。第二種寫法可以防止我們因為少寫了一個等號而需要去通過調(diào)試找到這個bug,編譯器會報錯錯誤在第幾行的。
? 補(bǔ)充:賦值操作符是從右像左進(jìn)行的,表達(dá)式的值是左邊操作符數(shù)里的值。比如 a = 10;把10賦給a,結(jié)果為a,是10。
4.條件表達(dá)式和逗號表達(dá)式
4.1條件表達(dá)式
? 條件表達(dá)式是唯一的一個三目操作符,它使用的符號是?:。它與if else雙分支語句的功能一樣,但它寫起來比較間接且可以當(dāng)成表達(dá)式賦值。
? a大于b嗎?如果大于,這一整個表達(dá)式的結(jié)果就是a;如果不大于,這一整個表達(dá)式的結(jié)果就是b;
? exp1?exp2:exp3,exp1表達(dá)式為真,exp2就是條件表達(dá)式的結(jié)果,反之,exp3是條件表達(dá)式的結(jié)果。
? 我們可以把這個條件表達(dá)式直接賦值給max,因為它是有值的,我們看下面用if else語句等效用法。
? 所以我們得知條件表達(dá)式與if else語句等效,第二點就是,我們不能把if else語句放在max初始化的賦值操作符的右邊,像這樣int max = if else語句;是的,我先埋個伏筆,后面講表達(dá)式和語句的關(guān)系的時候讀者們自然就恍然大悟了。
4.2逗號表達(dá)式
? 逗號表達(dá)式是用來表示連續(xù)一串需要執(zhí)行的表達(dá)式,它和代碼塊有點像,且看下面代碼:
? 本來給c賦值的時候,一般只有一個表達(dá)式,現(xiàn)在我們使用逗號表達(dá)式,把四個表達(dá)式a +=10等串起來,計算機(jī)會從左到右依次執(zhí)行a+=10,b>0,b++,c+=1這四個表達(dá)式。所以a和b分別變成了10和1,那為什么c的結(jié)果是1?
? 逗號表達(dá)式的結(jié)果是最后一個表達(dá)式的值。c+=1把c變成了1,再把1賦值給c,這里c經(jīng)歷了兩次賦值,因為c+=1的本質(zhì)是 c = c + 1;
? 前面提到說代碼塊和逗號表達(dá)式有相像的地方,相像在哪里呢?我們知道在我們需要多條語句的時候并且語法限制語句只能是一條,我們就用代碼塊把多條語句括起來,使這一整個代碼塊被視作一條語句(里面包含多條語句)。在賦值的時候,我們只能用一個表達(dá)式給變量賦值,但我們想要執(zhí)行其它多個表達(dá)式的時候,使用逗號表達(dá)式,可以在原先只能用一個表達(dá)式的語句中,使用多個表達(dá)式,是逗號表達(dá)式讓多個表達(dá)式被視為一個表達(dá)式成為可能。
? 總結(jié):代碼塊使多條語句成為一條語句,逗號表達(dá)式使多個表達(dá)式成為一個表達(dá)式。逗號表達(dá)式的運算特點是從左到右依次執(zhí)行,整個表達(dá)式的結(jié)果是最后一個表達(dá)式的值。
? 補(bǔ)充:逗號表達(dá)式的優(yōu)先級最低,如果我們沒有加括號,可能會運算出我們意料之外的結(jié)果,所以加上括號表示計算順序是有必要的。
? 甚至,細(xì)心的話,你可以看到感受到計算的順序。(c = ++a),(b+=2),(c+=3);在第一個表達(dá)式計算完后,c變成了1,到第三個表達(dá)式 c = c(1) + 3,這里右邊的c已經(jīng)是1了,不再是0了。所以c最后的值打印出來才是4。
? 其實博主在舉例的時候也沒想到,在運行之前自己腦中過了一遍認(rèn)為c最后是3,運行后看到結(jié)果想了想,嗯嗯~ 你懂得。
? 補(bǔ)充:在C++里有順序點的概念,后來因為在多線程中用順序點不好表示,就去除去了順序點的概念,不過依舊對我們有輔助理解的作用。語句的結(jié)尾(分號),一個完整的表達(dá)式(for循環(huán)中的控制表達(dá)式,while中的判斷表達(dá)式等諸如此類的),逗號表達(dá)式里的每個表達(dá)式都是一個順序點,計算機(jī)保證在進(jìn)入到下一個順序點前,將此次發(fā)生的改變?nèi)扛碌絻?nèi)存中。
? 用這里的例子講就是:執(zhí)行完(c = ++a),在進(jìn)入到(b += 2)這個表達(dá)式之前,c在內(nèi)存中的值被改成1的動作是完成了的。
5.下標(biāo)引用&函數(shù)調(diào)用&結(jié)構(gòu)訪問
? 這三種操作符也經(jīng)常用:[]、()、.(點操作符)、->
? 數(shù)組元素的訪問可以數(shù)組的方式,后面講到指針的時候,會介紹使用指針的方式,數(shù)組和指針很像,因為數(shù)組的底層實現(xiàn)是用指針滴~
? 使用下標(biāo)可以輕松訪問到數(shù)組中的每個元素,[]的操作數(shù)是數(shù)組名arr和元素對應(yīng)的下標(biāo),數(shù)組的下標(biāo)是從0開始的,相比較于元素個數(shù),下標(biāo)的最大值是元素個數(shù)減1。
? 函數(shù)調(diào)用操作符(),函數(shù)在調(diào)用的時候,不能省略。
#include <stdio.h>
//這里的()不是操作符,而是函數(shù)的形式和數(shù)組一樣
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
//()函數(shù)調(diào)用操作符
int ret = Add(a, b);//,不是逗號表達(dá)式
return 0;
}
? 訪問結(jié)構(gòu)體結(jié)構(gòu)成員的操作符有兩個,一個是用于結(jié)構(gòu)體變量的,一個是用于結(jié)構(gòu)體指針的。
- 點操作符.
#include <stdio.h>
struct Stu
{
int age;
char name[12];
char sex[5];
};
int main()
{
struct Stu s1 = {10, "小明", "男"};
printf("%d %s %s", s1.age, s1.name, s1.sex);
return 0;
}
? struct Stu創(chuàng)建一個結(jié)構(gòu)體類型,還沒學(xué)過結(jié)構(gòu)體的讀者可以想成數(shù)據(jù)類型一樣,用數(shù)據(jù)類型創(chuàng)建一個s1變量,它里面有三個成員變量,訪問的時候要.。
- ?箭頭操作符->
#include <stdio.h>
struct Stu
{
int age;
char name[12];
char sex[5];
};
int main()
{
struct Stu s1 = {10, "小明", "男"};
struct Stu* ps = &s1;
printf("%d %s %s\n", ps->age, ps->name, ps->sex);
printf("%d %s %s\n", (*ps).age, (*ps).name, (*ps).sex);
//對指針解應(yīng)用,*ps == s1
return 0;
}
? 結(jié)構(gòu)體指針訪問結(jié)構(gòu)體成員的時候,用箭頭指向結(jié)構(gòu)體成員就可以了。
6.表達(dá)式與語句的關(guān)系
? 任何一個表達(dá)式都有是有值的,可能表面認(rèn)不出來它有值,但可以算出來。比如:int a = 5;a = 10;這個表達(dá)式a = 10的值是10, a > 11這個表達(dá)式為0,因為a不大于11,為假,計算機(jī)對這些假的表達(dá)式賦值為0,真的表達(dá)式賦值為1。
? 而任何一個表達(dá)式加上分號后就能成為一個語句,反之則不成立,一個語句去掉分號不一定是表達(dá)式。
int main()
{
3//這是一個表達(dá)式,值為3
3;//表達(dá)式加上分號,變成一條語句,只不過這條語句沒啥作用
//聰明一點的編譯器甚至?xí)^這種無意義的語句
//聲明語句
int a = 10;//聲明a
int b;//聲明b
//去掉分號
int a = 10//這是啥??我不認(rèn)識,也沒見過,bug
int b//這是?表達(dá)式?有人說,這不就是一個b是一個隨機(jī)值嘛,那么?
int c = int b;//這句代碼見過嗎?沒錯你見過了,就是now,反正它編不過去。
//所以表達(dá)式加上分號是能變成語句的
int d = 10;
d = 20//表達(dá)式
d = 20;//語句
//聲明語句呀,if語句,for語句是不能當(dāng)表達(dá)式的,因為它們沒有值。
}
? 沒想到兩篇操作符講解字?jǐn)?shù)加起來還能差不都到一萬字,真沒想到,哈哈(苦笑不得)。好啦,這就是C語言中有關(guān)操作符的所有知識啦,下一篇見~
結(jié)語:希望讀者讀完有所收獲!在學(xué)C的路上,祝福我們能越來越C!?
? 讀者對本文不理解的地方,或是發(fā)現(xiàn)文章在內(nèi)容上有誤等,請在下方評論區(qū)留言告訴博主喲~,也可以對博主提出一些文章改進(jìn)的建議,感激不盡!最后的最后!文章來源:http://www.zghlxwxcb.cn/news/detail-450920.html
? ?求點贊,求關(guān)注,你的點贊是我更新的動力,一起努力進(jìn)步吧。文章來源地址http://www.zghlxwxcb.cn/news/detail-450920.html
到了這里,關(guān)于操作符講解2---C語言的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!