目錄
一個(gè)工程中出現(xiàn)兩個(gè)及以上的main函數(shù)
為什么會(huì)有這么多的數(shù)據(jù)類(lèi)型?
計(jì)算機(jī)是怎么對(duì)內(nèi)存單元編號(hào)的呢?
本文主要是先帶大家全局的認(rèn)識(shí)一下C語(yǔ)言,將C語(yǔ)言的主要的東西都看看,了解一下,對(duì)C語(yǔ)言先產(chǎn)生一個(gè)認(rèn)識(shí),每個(gè)知識(shí)點(diǎn)后面都會(huì)多帶帶寫(xiě)博客詳細(xì)介紹。
C語(yǔ)言是一門(mén)通用的計(jì)算機(jī)編程語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā),C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程
語(yǔ)言,保持著良好跨平臺(tái)的特性。
由于C語(yǔ)言的各大優(yōu)點(diǎn)使得各大開(kāi)發(fā)廠商紛紛使用,并且各個(gè)廠商都有了自己的C語(yǔ)言,這就使得各廠商的C語(yǔ)言語(yǔ)法出現(xiàn)差異,為了避免這種情況,由美國(guó)國(guó)家標(biāo)準(zhǔn)局為C語(yǔ)言制定了一套完整的美國(guó)國(guó)家標(biāo)準(zhǔn)語(yǔ)法,稱(chēng)為ANSI C,作為C語(yǔ)言最初的標(biāo)準(zhǔn)。
并且C語(yǔ)言是一門(mén)面向過(guò)程的編程語(yǔ)言,編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。其中MSVC便是微軟的C語(yǔ)言編譯器,VS2019中的C語(yǔ)言便是MSVC編譯器。編譯環(huán)境的詳細(xì)搭建步驟我也已經(jīng)寫(xiě)了,請(qǐng)點(diǎn)擊這里查看C語(yǔ)言編譯環(huán)境的搭建?!?/p>
語(yǔ)言 | 用途 | 舉例 |
人類(lèi)的語(yǔ)言 | 人與人之間交流 | 漢語(yǔ),英語(yǔ) |
計(jì)算機(jī)語(yǔ)言 | 人與計(jì)算機(jī)交流的語(yǔ)言 | C/C++/JAVA |
C語(yǔ)言廣泛應(yīng)用于底層的軟件開(kāi)發(fā)
#include int main(){ printf("Hello world!"); return 0;}
?一個(gè)C語(yǔ)言代碼中必須包含一個(gè)main函數(shù)--主函數(shù),main函數(shù)是程序的入口,有固定寫(xiě)法。要注意的是一個(gè)工程中只能有一個(gè)main函數(shù)。
main前面的int表示函數(shù)返回類(lèi)型為整型,左花括號(hào)表示函數(shù)開(kāi)始,右花括號(hào)表示函數(shù)結(jié)束;花括號(hào)所包含的部分叫做函數(shù)體,為該函數(shù)所要實(shí)現(xiàn)的邏輯功能語(yǔ)句。return 0表示返回值是0,0為整數(shù),與前面的int相呼應(yīng)。printf----print function----打印函數(shù),而printf屬于庫(kù)函數(shù),是C語(yǔ)言自身提供的函數(shù),庫(kù)函數(shù)的使用必須要引用頭文件,所以使用了#include
在菜單欄中有 調(diào)試--開(kāi)始執(zhí)行(快捷鍵Ctrl+F5)
我們用一段代碼來(lái)驗(yàn)證一下
#include int main(){ printf("Hello world!"); return 0;}int main(){ printf("Hello world!"); return 0;}
?編譯器報(bào)錯(cuò)
如果是在同一個(gè)工程中不同的.c文件中呢,也是一樣的,同一個(gè)工程中只能有一個(gè)main函數(shù)。
我們前面說(shuō)過(guò),main函數(shù)是程序的入口,如果一個(gè)工程出現(xiàn)多個(gè)main函數(shù),那么這個(gè)程序到底從哪里開(kāi)始執(zhí)行,從哪個(gè)main函數(shù)進(jìn)去是不確定的。
我們?cè)谏钪薪?jīng)常會(huì)用到各種各樣的數(shù)據(jù),例如年齡,體重,價(jià)格等等,而不同的數(shù)據(jù)的類(lèi)型也是不一樣的,比如年齡是整數(shù),體重是小數(shù)。
我們寫(xiě)程序,寫(xiě)軟件也是為了能夠解決生活中的問(wèn)題,描述生活中的問(wèn)題,所以C語(yǔ)言它有各種數(shù)據(jù)類(lèi)型。
char | 字符數(shù)據(jù)類(lèi)型 | 字符 |
short | 短整型 | 整數(shù) |
int? | 整型 | |
long | 長(zhǎng)整型 | |
long long | 更長(zhǎng)的整型 | |
float | 單精度浮點(diǎn)數(shù) | 小數(shù) |
double | 雙精度浮點(diǎn)數(shù) |
我們的生活中本來(lái)就有很多種數(shù)據(jù)類(lèi)型,在寫(xiě)代碼的時(shí)候,我們選擇合適的數(shù)據(jù)類(lèi)型去創(chuàng)建變量,解決問(wèn)題,使得空間利用率更高,并且更加豐富的表達(dá)生活中的各種值。
C語(yǔ)言中有一個(gè)關(guān)鍵字sizeof可以用來(lái)計(jì)算各種變量,數(shù)據(jù)類(lèi)型的大小
如下代碼:
#include int main(){ printf("%d/n", sizeof(char)); printf("%d/n", sizeof(short)); printf("%d/n", sizeof(int)); printf("%d/n", sizeof(long)); printf("%d/n", sizeof(long long)); printf("%d/n", sizeof(float)); printf("%d/n", sizeof(double));}
運(yùn)行結(jié)果:
(注意:sizeof計(jì)算出來(lái)的結(jié)果單位是字節(jié))
我們會(huì)發(fā)現(xiàn)int為整型,而long是長(zhǎng)整型,結(jié)果運(yùn)行結(jié)果中int和long的大小一樣,這是怎么回事呢?注意在這里C語(yǔ)言標(biāo)準(zhǔn)規(guī)定,sizeof(int)<=sizeof(long),并且sizeof(long)<=sizeof(long long)
在32位平臺(tái)sizeof(long)大小為4個(gè)字節(jié),而在64位平臺(tái),sizeof(long)大小為8個(gè)字節(jié)
選擇合適的數(shù)據(jù)類(lèi)型,如下代碼:
int main(){ //這里創(chuàng)建一個(gè)年齡的變量 //short的范圍為-32768~32767,足夠表示年齡 short age = 18; //創(chuàng)建一個(gè)變量表示體重 double weight = 58.9; return 0;}
變量:生活中有些值是可變的(eg.年齡,身高,體重等),C語(yǔ)言中用變量來(lái)表示
常量:有些值是不變的(eg.身份證號(hào),血型等),C語(yǔ)言中用常量來(lái)表示
我們通過(guò)這段代碼來(lái)了解全局變量與局部變量
#include //全局變量int i = 20;int main(){ //局部變量 int i = 10; printf("%d/n", i); return 0;}
運(yùn)行結(jié)果:
?那么這里為什么運(yùn)行結(jié)果是10而不是20呢?
有幾個(gè)點(diǎn)需要注意:
#include int main(){ int n1 = 0; //定義整型變量n1,n2和num并初始化為0 int n2 = 0; int sum = 0; printf("請(qǐng)輸入n1和n2/n"); //提示用戶(hù)輸入 scanf("%d%d", &n1, &n2); //輸入想要進(jìn)行運(yùn)算的兩個(gè)數(shù) sum = n1 + n2; //將n1和n2相加并賦值給sum printf("sum=%d/n", sum); //打印sum的值 return 0;}
說(shuō)明:
scanf函數(shù):代碼中用到scanf函數(shù),屬于庫(kù)函數(shù),也是要引頭文件
注意事項(xiàng):
printf函數(shù):%d表示以整數(shù)形式進(jìn)行打印。
這兩個(gè)函數(shù)中,其中格式控制字符串用于指定格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開(kāi)頭的字符串,在%后面跟有各種格式字符,以說(shuō)明輸出數(shù)據(jù)的類(lèi)型、形式、長(zhǎng)度、小數(shù)位數(shù)等,如下所示:
%d??????//打印整型
%c??????//打印字符
%f??????//打印浮點(diǎn)數(shù)
%p??????//以地址的形式打印(打印地址)
%x??????//打印16進(jìn)制整數(shù)
%o??????//打印8進(jìn)制整數(shù)
作用域(scope):這個(gè)變量哪里可以使用,哪里可以起作用,哪里就是它的作用域
生命周期:變量的生命周期指的是變量的創(chuàng)建到變量的銷(xiāo)毀之間的一個(gè)時(shí)間段
可以通過(guò)以下代碼的對(duì)比來(lái)深刻理解作用域
代碼1:
#include int main(){ { int n = 10; printf("n=%d/n", n); } return 0;}
運(yùn)行結(jié)果:
代碼2:
#include int main(){ { int n = 10; //printf("n=%d/n", n); } printf("n=%d/n", n); return 0;}
運(yùn)行結(jié)果 :
?分析:離int n = 10;最近的花括號(hào)所包含的里面就是變量n的作用域,它的地盤(pán),而一但出了花括號(hào),它就不起作用了。所以就會(huì)報(bào)錯(cuò)。
代碼3:
#include int a = 10; //全局變量void test() //這里定義一個(gè)函數(shù)進(jìn)行測(cè)試{ printf("test-->a=%d/n", a);}int main(){ printf("a=%d/n", a); test(); return 0;}
運(yùn)行結(jié)果:
?從代碼3就可以看出全局變量的作用域更廣,即整個(gè)工程。
?C語(yǔ)言中的常量和變量的定義的形式有所差異
C語(yǔ)言中的常量分為以下幾種:
通過(guò)以下代碼來(lái)理解這幾種常量
代碼1:
1.字面常量
#include int main(){ //1.字面常量 55; 9.8; "b"; //直接寫(xiě)出來(lái)的常量就被稱(chēng)為字面常量 return 0;}
?代碼2(與代碼3進(jìn)行對(duì)比):
#include int main(){ int a = 10; printf("a=%d/n", a); a = 20; printf("a=%d/n", a); return 0;}
?運(yùn)行結(jié)果:
?代碼3:
2.const修飾的常變量
#include int main(){ //2.const修飾的常變量 const int a = 10; //用const進(jìn)行修飾,使其成為常變量 printf("a=%d/n", a); a = 20; printf("a=%d/n", a); return 0;}
?運(yùn)行結(jié)果:
?通過(guò)代碼2和代碼3的對(duì)比即可發(fā)現(xiàn),a本身為變量,但被const修飾之后,它本質(zhì)上還是一個(gè)變量,但它又具有了常屬性,不能改,在使用常量的時(shí)候是不能用const修飾的常變量的,但可以用它去表示一個(gè)不能變的量(具備常屬性的一個(gè)變量)
?比如以下情況:
?在創(chuàng)建數(shù)組的時(shí)候,數(shù)組的長(zhǎng)度應(yīng)該是指定的一個(gè)確定的常數(shù),雖然n被const修飾之后具有了常屬性,但它本質(zhì)上還是一個(gè)變量,不能作為數(shù)組長(zhǎng)度來(lái)使用。
3.#define定義的標(biāo)識(shí)符常量
代碼1:
?代碼2:
?可以看到這(AGE)也是不能被修改的,因?yàn)樗且环N常量
?4.枚舉常量
在生活中有很多的取值是可以一一列舉的
eg.
性別:男,女,保密
三原色:紅,綠,藍(lán)
星期:1,2,3,4,5,6,7
如下代碼:
?注意:枚舉常量也同樣是不能改變的,從運(yùn)行結(jié)果就可看出,枚舉常量它是有具體的值的,eg.RED值為0,GREEN值為1,BLUE值為2。
我們首先來(lái)認(rèn)識(shí)一下字符串,前面我們寫(xiě)過(guò)這樣一個(gè)代碼
#include int main(){ printf("hello world!/n"); return 0;}
在printf函數(shù)里面被" "包含的部分即為字符串(這里的/n表示換行的意思)
以下幾種情況均為字符串
"abcde"
"b"
""? ? ? //空字符串
這種由雙引號(hào)引起來(lái)的一串字符稱(chēng)為字符串字面值,簡(jiǎn)稱(chēng)字符串
注意:字符串的結(jié)束標(biāo)志是一個(gè)/0 的轉(zhuǎn)義字符。在計(jì)算字符串長(zhǎng)度的時(shí)候/0 是結(jié)束標(biāo)志,不算作字符串內(nèi)容。通過(guò)以下代碼來(lái)理解:
#include int main(){ char arr1[] = "qwert"; char arr2[] = { "q","w","e","r","t" }; printf("%s/n", arr1); printf("%s/n", arr2);}
大家可以想想這段代碼打印的結(jié)果是什么呢?
結(jié)果如下:
?發(fā)現(xiàn)arr1正常打印,但arr2的打印結(jié)果為什么這么奇怪呢?
?接下來(lái)我們仔細(xì)分析一下:
在VS2019編譯器中按F10進(jìn)行調(diào)試,然后打開(kāi)監(jiān)視器窗口:
?可以在監(jiān)視器窗口中看到arr1和arr2中存的內(nèi)容
?通過(guò)這個(gè)我們可以發(fā)現(xiàn):arr1中有/0,所以在打印過(guò)程中遇到/0停了下來(lái);arr2中沒(méi)有/0,打印完qwert之后還未停下,繼續(xù)往后打印,而后面都是隨機(jī)值,所以就打印出來(lái)燙燙燙,/0本身的值為0,所以在往后打印過(guò)程中恰好有一個(gè)值為0,遇到結(jié)束標(biāo)志,打印結(jié)束。
那么我們就可以手動(dòng)的給arr2后面添加/0或者0來(lái)讓它具有結(jié)束的標(biāo)志,不會(huì)出錯(cuò)打印隨機(jī)值。如下代碼:
我們這里再介紹C語(yǔ)言提供的一個(gè)庫(kù)函數(shù)strlen--string length--字符串長(zhǎng)度,這是用來(lái)計(jì)算字符串長(zhǎng)度的,遇到/0結(jié)束,不計(jì)算/0;頭文件為
?我們會(huì)看到,arr1里賣(mài)弄一共5個(gè)字符,長(zhǎng)度為5,沒(méi)有問(wèn)題,但這個(gè)arr2由于沒(méi)有/0作為結(jié)束標(biāo)志,后面全部都是隨機(jī)值,所以strlen一直往后計(jì)算,直到遇到第22個(gè)值為0,才結(jié)束計(jì)算 ,所以它計(jì)算出來(lái)的21本身就是一個(gè)隨機(jī)值。(同樣可以后面添加"/0"或者0來(lái)解決)
這里其實(shí)我們也可以通過(guò)關(guān)鍵字sizeof來(lái)計(jì)算,但要注意的是sizeof會(huì)將"/0"計(jì)算進(jìn)去。如下代碼及結(jié)果:
前面我們見(jiàn)到過(guò)"/n","/0"這樣的字符,都是轉(zhuǎn)義字符
我們可以通過(guò)以下代碼來(lái)體驗(yàn)一下:將c:/code/test.c打印在屏幕上,以下代碼到底能不能實(shí)現(xiàn)?
代碼0:
?通過(guò)運(yùn)行發(fā)現(xiàn)打印的并不是我們想要的結(jié)果,這個(gè)時(shí)候就有了轉(zhuǎn)義字符(轉(zhuǎn)變它原來(lái)的意思)的概念。通過(guò)以下兩段代碼對(duì)比理解一下:
代碼1:
?代碼2:
?通過(guò)對(duì)比我們就可以發(fā)現(xiàn),在n前面加上/后,它就已經(jīng)不是單純的n了,而有了其他的作用(換行),代碼保存路徑以及請(qǐng)按任意鍵關(guān)閉窗口與hello之間有個(gè)空行,而代碼1沒(méi)有/n,所以就沒(méi)有空行。所以在這里/n就是一個(gè)轉(zhuǎn)義字符了?;剡^(guò)頭看,代碼0里面的/t也是一個(gè)轉(zhuǎn)義字符了,即水平制表符。
下來(lái)我們可以看看都有哪些轉(zhuǎn)義字符:
轉(zhuǎn)義字符 | 含義 |
/? | 在書(shū)寫(xiě)連續(xù)多個(gè)問(wèn)號(hào)時(shí)使用,防止他們被解析成三字母詞 |
/" | 用于表示字符常量" |
/“ | 用于表示一個(gè)字符串內(nèi)部的雙引號(hào) |
// | 用于表示一個(gè)反斜杠,防止它被解釋為一個(gè)轉(zhuǎn)義序列符。 |
/a | 警告字符,蜂鳴 |
/b | 退格符 |
/f | 進(jìn)紙符 |
/n | 換行 |
/r | 回車(chē) |
/t | 水平制表符 |
/v | 垂直制表符 |
/ffffd | ffffd表示1~3個(gè)八進(jìn)制的數(shù)字。 如: /130 X |
/xdd | dd表示2個(gè)十六進(jìn)制數(shù)字。 如: /x30 0 |
對(duì)以上的轉(zhuǎn)義字符解釋?zhuān)?/p>
代碼1:打印字符"a"
?發(fā)現(xiàn)成功打印出來(lái)字符"a"
代碼2:打印字符單引號(hào)"""
#include int main(){ printf("%c/n", """); return 0;}
運(yùn)行程序發(fā)現(xiàn)程序報(bào)錯(cuò),那么這又是什么原因呢?
就是因?yàn)槿齻€(gè)單引號(hào)放在一起,自動(dòng)的前兩個(gè)單引號(hào)結(jié)合,后面單引號(hào)落單了,所以就會(huì)報(bào)錯(cuò),這個(gè)時(shí)候就可以使用轉(zhuǎn)義字符/"?,使它成為一個(gè)普通的字符單引號(hào),字符/"也是如此,不在啰嗦。如下代碼:
?
? ? ? ?
?????????3.//? 雙斜杠這個(gè)轉(zhuǎn)義字符其實(shí)它的用途就是我們剛才的代碼0,我們想要將代碼路徑c:/code/test.c打印到屏幕上,但是里面的/t
是一個(gè)轉(zhuǎn)義字符,現(xiàn)在我們不想讓它轉(zhuǎn)義,就想讓他打印出來(lái)/t,我們就可以使用//將它再次轉(zhuǎn)義,使/t?里面的斜杠就只是一個(gè)斜杠,如下:
?
? ? ? ? ?4./t? 水平制表符,相當(dāng)于起到了電腦鍵盤(pán)table鍵的作用
????????5.接下來(lái)我們來(lái)說(shuō)說(shuō)最后兩個(gè)轉(zhuǎn)義字符/ffffd和/xdd??,涉及到8進(jìn)制和16進(jìn)制
平時(shí)我們用到的10進(jìn)制數(shù)就是由0-9這10個(gè)數(shù)構(gòu)成的,那么8進(jìn)制就是由0-7這8個(gè)數(shù)構(gòu)成(16進(jìn)制就是由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(xiàn)來(lái)表示,A--10,B--11,C--12,D--13,E--14,F(xiàn)--15),在/后面跟3個(gè)8進(jìn)制數(shù),eg./061
運(yùn)行以下代碼看看結(jié)果
?可以看到結(jié)果是1,但是8進(jìn)制數(shù)061的10進(jìn)制數(shù)也不是1呀,為什么結(jié)果是1呢?因?yàn)樵谶@里它是一個(gè)字符,將8進(jìn)制數(shù)轉(zhuǎn)化為10進(jìn)制數(shù)49(ASCII碼值)之后所對(duì)應(yīng)的那個(gè)字符是1。
再詳細(xì)說(shuō)說(shuō),我們的鍵盤(pán)上可以敲出來(lái)一系列的字符,eg.@#$%^&*,但是計(jì)算機(jī)只能識(shí)別二進(jìn)制呀,所以人們就給字符編了統(tǒng)一的號(hào)碼,eg.? a--97,b--98………將這種編碼稱(chēng)為ASCII編碼(有專(zhuān)門(mén)的ASCII碼表),而字符"1"的ASCII值為49,轉(zhuǎn)化為8進(jìn)制也就是061。
/xdd 這個(gè)轉(zhuǎn)義字符我們就不再啰嗦,和/ffffd同樣的道理
下面來(lái)一道筆試題進(jìn)行練習(xí)
//程序打印的結(jié)果是什么?#include int main(){ printf("%d/n", strlen("abcdef")); printf("%d/n", strlen("c:/test/328/test.c")); return 0;}
?這段代碼的運(yùn)行結(jié)果是什么呢?可以先想想,? 第一個(gè)printf的答案比較簡(jiǎn)單,就是字符串的長(zhǎng)度6(注意strlen函數(shù)不計(jì)算/0),而第二個(gè)printf的答案呢,18?? 12?還是說(shuō)14? 這幾個(gè)答案都不對(duì)。
我們來(lái)分析一下,在"c:/test/328/test.c"這個(gè)字符串里面,首先/t是轉(zhuǎn)義字符,作為一個(gè)整體算作一個(gè)字符,/328,這里面的8已經(jīng)超出了8進(jìn)制的范圍(8在這里本身就是一個(gè)坑),所以應(yīng)該將/32作為一個(gè)整體,16進(jìn)制,所以第二個(gè)printf打印的結(jié)果應(yīng)該是14
?
注意:
C語(yǔ)言風(fēng)格的注釋?zhuān)?*xxxxxx*/存在缺陷,不能嵌套注釋,嵌套注釋就會(huì)出問(wèn)題
C++風(fēng)格的注釋?zhuān)?/xxxxxxx,可以注釋一行,也可以注釋多行
我們的生活中總是面臨著各種各樣的選擇,怎么選就看自己了
通過(guò)以下代碼來(lái)體驗(yàn)一下:
?
?這段代碼用到了一個(gè)if else語(yǔ)句,當(dāng)if后面圓括號(hào)里面的判斷條件為真時(shí),執(zhí)行if下面的語(yǔ)句,當(dāng)條件為假時(shí),執(zhí)行else后面的語(yǔ)句
在我們色生活中也會(huì)有很多的事情都在重復(fù),eg.起床,干飯,學(xué)習(xí),睡覺(jué)
?C語(yǔ)言里面有3種循環(huán)
?通過(guò)以下代碼來(lái)體驗(yàn)一下
在數(shù)學(xué)中我們經(jīng)常和函數(shù)打交道,eg. f(x,y)=x+y,這是一個(gè)二元函數(shù),該函數(shù)有兩個(gè)參數(shù)(變量),x和y,那么其實(shí)C語(yǔ)言里面的函數(shù)和這個(gè)也是非常相似的。通過(guò)以下代碼來(lái)了解一下
?我們之前計(jì)算加法都是直接sum=x+y這樣來(lái)算的,但在這段代碼中我們定義了一個(gè)函數(shù)Add來(lái)計(jì)算加法。首先創(chuàng)建了兩個(gè)變量x,y和z,調(diào)用Add函數(shù),并將Add函數(shù)的返回值賦給z,最后將z的值打印了出來(lái)。
重點(diǎn)再來(lái)看一下Add函數(shù),前面的int表示該函數(shù)的返回值為int類(lèi)型,后面括號(hào)里面的int x,int y表示Add函數(shù)的兩個(gè)參數(shù)均為int類(lèi)型。花括號(hào)里面即為函數(shù)體,創(chuàng)建了臨時(shí)變量z來(lái)接受x+y的值,并在最后將作為返回值返回
函數(shù)的特點(diǎn):簡(jiǎn)化代碼,代碼復(fù)用
數(shù)組其實(shí)就是一組數(shù)。比如我們平時(shí)要存放一個(gè)數(shù)10,那么只需要int a = 10;就可以完成;那如果要存放1,2,3,4,5這5個(gè)數(shù)字呢,不可能創(chuàng)建5個(gè)整型變量來(lái)存放吧,這樣創(chuàng)建和使用都會(huì)很麻煩,所以這個(gè)時(shí)候就有了數(shù)組的概念----一組相同類(lèi)型元素的集合。
int arr[10] = { 0,1,2,3,4 };
這個(gè)代碼中就是定義了一個(gè)數(shù)組,int表示數(shù)組內(nèi)的元素類(lèi)型為整型,arr是數(shù)組名,[10]里面的10表示這個(gè)數(shù)組最多放10個(gè)元素,后面花括號(hào)里面是對(duì)這個(gè)數(shù)組進(jìn)行了初始化,前五個(gè)元素分別初始化為了0,1,2,3,4,而剩下的5個(gè)元素會(huì)默認(rèn)初始化為0??梢源蜷_(kāi)監(jiān)視器來(lái)看看:
?關(guān)于數(shù)組:
如果要將數(shù)組中的某個(gè)元素打印出來(lái)呢?代碼如下:
?全部打印呢?
?代碼中我們通過(guò)一個(gè)while循環(huán)來(lái)實(shí)現(xiàn)打印數(shù)組中的全部?jī)?nèi)容(每次打印一個(gè)元素)
+? ? -? ? *? ? /? ? %
>>? ? <<
&? ? ^? ? |
=? ? +=? ? -=? ? *=? ? /=? ? &=? ? ^=? ? |=? ? >>=? ? <<=
!? ? ? ? ? ? ? ? ? ? ? ? ? 邏輯反操作
-? ? ? ? ? ? ? ? ? ? ? ? ? 負(fù)值
+? ? ? ? ? ? ? ? ? ? ? ? ?正值
&? ? ? ? ? ? ? ? ? ? ? ? ?取地址
sizeof? ? ? ? ? ? ? ? ? 操作數(shù)的類(lèi)型長(zhǎng)度(以字節(jié)為單位)
~? ? ? ? ? ? ? ? ? ? ? ? ? 對(duì)一個(gè)數(shù)的二進(jìn)制按位取反
--? ? ? ? ? ? ? ? ? ? ? ? ?前置、后置--
++? ? ? ? ? ? ? ? ? ? ? ?前置、后置++
*? ? ? ? ? ? ? ? ? ? ? ? ? 間接訪問(wèn)操作符(解引用操作符)
(類(lèi)型)? ? ? ? ? ? ? ? ? 強(qiáng)制類(lèi)型轉(zhuǎn)換
>
>=
<
<=
!=? ? ? ? ? ? ? ? ? ? ? ? ?用于測(cè)試“不相等”
==? ? ? ? ? ? ? ? ? ? ? ? 用于測(cè)試“相等”
&&? ? ? ? ? ? ? ? ? ? ? ? 邏輯與
||? ? ? ? ? ? ? ? ? ? ? ? ? ?邏輯或
exp1 ? exp2 : exp3
exp1, exp2, exp3, …expN
[]? ? ?()? ? ?.? ? ?->
這些操作符我們后面還會(huì)繼續(xù)講,這里先簡(jiǎn)單了解一下
我們先來(lái)了解一下 / 這個(gè)操作符,通過(guò)以下代碼來(lái)體驗(yàn)以下:
#include int main(){ printf("%d/n", 7 / 2); return 0;}
那么這段代碼的運(yùn)行結(jié)果是什么呢?? ?3.5?
運(yùn)行結(jié)果:
?發(fā)現(xiàn)運(yùn)行結(jié)果是3,這是為什么呢?
來(lái)分析一下,C語(yǔ)言里面的 / 和我們平時(shí)數(shù)學(xué)中的除號(hào)還是有區(qū)別的,這里是整除求商的意思,7除以2本來(lái)應(yīng)該是3.5,但這里是整除,商只有3,沒(méi)有5,所以結(jié)果為3。那么如果我們想要得到3.5應(yīng)該怎么做呢?只需要讓 / 兩邊的數(shù)字有一個(gè)是小數(shù)即可,如下代碼:
那么有沒(méi)有哪個(gè)操作符是用來(lái)整除求余的呢,肯定是有的------%取模操作符,如下代碼:
?7對(duì)2整除的余數(shù)便是1
再來(lái)看看移位操作符:右移操作符>> 和左移操作符?<
#include int main(){ int a = 8; printf("%d/n", a >> 1); return 0;}
這里的a>>1表示將a的值向右移動(dòng)一位,那么移動(dòng)一位到底移的是什么位呢? 移的是二進(jìn)制位,那么我們?cè)谶@里將a先寫(xiě)成二進(jìn)制形式為1000,而這里的a又是一個(gè)整型,4個(gè)字節(jié)----32個(gè)比特位,準(zhǔn)確來(lái)寫(xiě)應(yīng)該是00000000000000000000000000001000,這里將a向右移動(dòng) 一位我們通過(guò)下圖來(lái)更深刻的理解:
?可以看到右移之后1的權(quán)重降低,值變?yōu)?,可以通過(guò)運(yùn)行來(lái)驗(yàn)證一下
?左移同樣也是這樣,我們通過(guò)后面的博客細(xì)細(xì)道來(lái)。
位操作符:
&? ? ? ? ? ? ?按位(二進(jìn)制位)與
|? ? ? ? ? ? ? ?按位(二進(jìn)制位)或
^? ? ? ? ? ? ? 按位(二進(jìn)制位)異或
同樣通過(guò)以下代碼來(lái)體驗(yàn)一下:
#include int main(){ int a = 5; int b = 3; int c = a & b; printf("%d/n", c); return 0;}
通過(guò)下圖來(lái)理解
?所以a&b的結(jié)果就是1,a|b為7,a^b為6
再看賦值操作符
#include int main(){ int a = 10; a = a + 3; printf("%d/n", a); return 0;}
這里a本來(lái)是10,然后a=a+3就是給a加3之后放到a里面去,a就變成了13。并且這里用a+=5也是同樣的效果
單目操作符
前面我們看到的+,它就有兩個(gè)操作數(shù),a+b,必須有兩個(gè)操作數(shù),而單目操作符就是只有一個(gè)操作數(shù)
邏輯反操作 ! ,這個(gè)操作符它只關(guān)注操作數(shù)的真假
C語(yǔ)言里面是如何區(qū)分真假的呢?
0----表示假
非0----表示真
通過(guò)下面的代碼的結(jié)果來(lái)對(duì)比一下
下一個(gè)操作符 ~ 我們先來(lái)了解一下原碼,反碼和補(bǔ)碼的概念
比如int a = -1,我們將十進(jìn)制數(shù)字轉(zhuǎn)化為二進(jìn)制數(shù)字得到的是他的原碼,通過(guò)圖來(lái)理解
?注意:
以下代碼
#include int main(){ int a = 0; //分析: //a的原碼:00000000000000000000000000000000 //補(bǔ)碼: 00000000000000000000000000000000 //按位取反 11111111111111111111111111111111 //反碼; 11111111111111111111111111111110 //原碼: 10000000000000000000000000000001 //所以結(jié)果應(yīng)該是-1 printf("%d/n", ~a);}
這里再加一個(gè)小的知識(shí):
在C語(yǔ)言里面0分為+0和-0
+0
原碼:00000000000000000000000000000000
反碼:00000000000000000000000000000000
補(bǔ)碼:00000000000000000000000000000000
-0
原碼:10000000000000000000000000000000
反碼:11111111111111111111111111111111
補(bǔ)碼:10000000000000000000000000000000
自增自減操作符++,--
通過(guò)以下代碼來(lái)體驗(yàn)一下
#include int main(){ int a = 0; int b = a++; //后置++,先使用a的值,然后再讓a加1 int c = 1; int d = ++c; //前置++,先讓c加1,然后再把c的值賦給d printf("a=%d,b=%d/n",a,b); printf("c=%d,d=%d/n", c, d);}
?強(qiáng)制類(lèi)型轉(zhuǎn)換操作符
如下代碼:
?3.14是double類(lèi)型的,將double類(lèi)型的數(shù)據(jù)賦給int類(lèi)型,我們發(fā)現(xiàn)編譯器報(bào)了一個(gè)警告
?那么我們應(yīng)該怎么解決呢?? 這個(gè)時(shí)候就可以用強(qiáng)制類(lèi)型轉(zhuǎn)換
#include int main(){ int a = (int)3.14; return 0;}
關(guān)系操作符
關(guān)系操作符其實(shí)就是用來(lái)比較大小,這里主要再來(lái)強(qiáng)調(diào)一下判斷相等與不相等,用的是==而不是=
以下情況我們可能后面稍不注意就會(huì)犯這種錯(cuò)誤
int main(){ int i = 1; if (i = 0) { printf("hello"); } return 0;}
這里會(huì)不會(huì)把hello打印出來(lái)呢?? ?答案就是:不會(huì)打印
原因:if后面的條件判斷用了一個(gè)賦值,這里不是在判斷i是不是等于0,而是將0賦給i,然后i是0條件為假,就不會(huì)打印,應(yīng)該要用==
邏輯操作符
邏輯與 &&? 表示的是如果兩邊的值都為真,那么結(jié)果為真,如果其中有一個(gè)為假,那么結(jié)果為假
羅技或 || 表示如果兩邊有一個(gè)值為真,那么結(jié)果為真,如果兩個(gè)都為假,那么結(jié)果為假
如下代碼示例:
int main(){ int a = 5; int b = 3; int c = 0; int d = 0; printf("%d,%d/n", a && b, a && c); printf("%d,%d/n", a || b, d || c);}
條件操作符?
這里的條件操作符有三個(gè)操作數(shù),所以也叫三目操作符。exp1 ? exp2 : exp3
含義:表達(dá)式1的結(jié)果如果為真,就執(zhí)行表達(dá)式2,如果表達(dá)式1的結(jié)果為假,就執(zhí)行表達(dá)式3
我們之前寫(xiě)代碼求兩個(gè)數(shù)的最大值都是通過(guò)if語(yǔ)句來(lái)判斷,現(xiàn)在我們完全可以通過(guò)條件操作符來(lái)計(jì)算,可以極大的簡(jiǎn)化代碼。
#include { int a = 5; int b = 3; int max = a > b ? a : b; printf("%d/n", max); return 0;}
逗號(hào)表達(dá)式
逗號(hào)隔開(kāi)的一串表達(dá)式。逗號(hào)表達(dá)式的結(jié)果從左向右依次計(jì)算,但表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果
#include int main(){ int a = (1 + 2, 2 - 3, 3 + 5); //表達(dá)式里面的從左到右以此計(jì)算,但最終結(jié)果是最后一個(gè)表達(dá)式的結(jié)果 printf("%d/n", a); //結(jié)果應(yīng)該是3+5==8 return 0;}
函數(shù)調(diào)用操作符
我們?cè)诿看握{(diào)用函數(shù)的時(shí)候都必須要有函數(shù)調(diào)用操作符(),圓括號(hào)里面放參數(shù),來(lái)傳參
auto? ?break? ?case? ?char? ?const? ?continue? ?default? ?do? ?double? ?else? ?enum? ? extern? ? float? ?for? ?goto? ?if? ?int? ?long? ?register? ?return? ?short? ?signed? ?sizeof? ?static? ?struct? ? switch? ?typedef? ?union? ?unsigned? ?void? ?volatile? ?while
auto關(guān)鍵字平時(shí)都是省略的,局部變量都是自動(dòng)創(chuàng)建,自動(dòng)銷(xiāo)毀的,所以C語(yǔ)言中的局部變量都是自動(dòng)變量
auto int a=10;? ? //這里的auto平時(shí)都是省略不寫(xiě)的
break? ? ? ?終止循環(huán)/switch
case? ? ? ? ?switch語(yǔ)句
const? ? ? ? 常變量
continue? ?繼續(xù)循環(huán)
default? ? ? ?switch
enum? ? ? ? ?枚舉
extern? ? ? ? 聲明外部符號(hào)
goto? ? ? ? ? ?跳轉(zhuǎn)(不建議使用)
register? ? ? 寄存器關(guān)鍵字
static? ? ? ? ? 靜態(tài)
(1.修飾局部變量,改變的是局部變量的生命周期,和程序的生命周期一樣
? ?2.修飾全局變量,改變了它的作用域,使這個(gè)變量只能在自己所在的源文件內(nèi)部使用
? ?3.修飾函數(shù),改變了這個(gè)函數(shù)的使用范圍,這個(gè)函數(shù)只能在自己所在的源文件內(nèi)部使用)
typedef? ? ? 類(lèi)型重定義
union? ? ? ? ?聯(lián)合體/共用體
volatile? ? ? ?比較少見(jiàn)
這些關(guān)鍵字,我們后面都會(huì)講到。
注意:在創(chuàng)建變量的時(shí)候變量名不能是關(guān)鍵字
通過(guò)以下代碼來(lái)了解一下:
#include #define PI 3.14int main(){ double a = PI; printf("%lf/n", a);}
這里的PI就是屬于標(biāo)識(shí)符常量
這里我們來(lái)寫(xiě)一個(gè)加法的宏來(lái)體驗(yàn)一下:
<文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119681.html
上次給大家分享了一個(gè)springboot+vue的校園招聘系統(tǒng),視頻教程加項(xiàng)目源碼,都是開(kāi)源的,應(yīng)該說(shuō)很香了,今天再給大家分享一個(gè)不錯(cuò)的springboot的項(xiàng)目。 老規(guī)矩,開(kāi)源,開(kāi)源,開(kāi)源?。?! 金九銀十來(lái)了,小伙伴們,沖??!前面已經(jīng)整理了很多的面試題,拿去學(xué)習(xí)吧! 1,??爆肝!整理了一周的Spring面試大全【含答案】,吊打Java面試官【建議收藏】!?? 2,??肝完了,一天掌握數(shù)據(jù)...
文章目錄 強(qiáng)烈推薦系列教程,建議學(xué)起來(lái)??! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動(dòng)添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動(dòng)補(bǔ)碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開(kāi)頭八、這個(gè)前言一定要看九、pyt...
人生苦短,我用Python 開(kāi)發(fā)環(huán)境搭建安裝 Python驗(yàn)證是否安裝成功安裝Pycharm配置pycharm 編碼規(guī)范基本語(yǔ)法規(guī)則保留字單行注釋多行注釋行與縮進(jìn)多行語(yǔ)句數(shù)據(jù)類(lèi)型空行等待用戶(hù)輸入print輸出 運(yùn)算符算術(shù)運(yùn)算符邏輯運(yùn)算符成員運(yùn)算符身份運(yùn)算符運(yùn)算符優(yōu)先級(jí) 字符串訪問(wèn)字符串中的值字符串更新合并連接字符串刪除空白startswith()方法endswith()方法字符串格式化...
閱讀 1322·2023-04-26 01:28
閱讀 2080·2021-11-08 13:28
閱讀 2327·2021-10-12 10:17
閱讀 2306·2021-09-28 09:46
閱讀 4150·2021-09-09 09:33
閱讀 3732·2021-09-04 16:40
閱讀 1112·2019-08-29 15:21
閱讀 2698·2019-08-26 17:17