成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

??整理2萬(wàn)字帶你走進(jìn)C語(yǔ)言(詳細(xì)講解+代碼演示+圖解)??(強(qiáng)烈建議收藏?。。。?

邱勇 / 4149人閱讀

目錄

一、什么是C語(yǔ)言?

二、第一個(gè)C語(yǔ)言程序

代碼

程序分析

?程序運(yùn)行

一個(gè)工程中出現(xiàn)兩個(gè)及以上的main函數(shù)

代碼

運(yùn)行結(jié)果

分析

三、數(shù)據(jù)類(lèi)型

數(shù)據(jù)各種類(lèi)型

為什么會(huì)有這么多的數(shù)據(jù)類(lèi)型?

計(jì)算機(jī)單位

?各個(gè)數(shù)據(jù)類(lèi)型的大小

?注意事項(xiàng)

數(shù)據(jù)類(lèi)型的使用

四、變量和常量

變量的分類(lèi)

變量的使用

變量的作用域和生命周期

?常量

五、字符串+轉(zhuǎn)義字符+注釋

字符串

?轉(zhuǎn)義字符

注釋

六、選擇語(yǔ)句

?七、循環(huán)語(yǔ)句

?八、函數(shù)

九、數(shù)組

數(shù)組是什么呢?

定義數(shù)組

數(shù)組的使用

十、操作符

十一、常見(jiàn)關(guān)鍵字

十二、#define 定義常量和宏

#define定義的標(biāo)識(shí)符常量

定義宏

十三、指針

前言

引例

計(jì)算機(jī)是怎么對(duì)內(nèi)存單元編號(hào)的呢?

?內(nèi)存空間的地址如何得到

想存地址怎么辦?

?

本質(zhì)目的不是為了存地址

指針變量的大小

?十四、結(jié)構(gòu)體

為什么會(huì)有結(jié)構(gòu)體呢?

創(chuàng)建結(jié)構(gòu)體


本文主要是先帶大家全局的認(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ǔ)言?

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>

計(jì)算機(jī)語(yǔ)言類(lèi)比理解表
語(yǔ)言用途舉例
人類(lèi)的語(yǔ)言人與人之間交流漢語(yǔ),英語(yǔ)
計(jì)算機(jī)語(yǔ)言人與計(jì)算機(jī)交流的語(yǔ)言C/C++/JAVA

C語(yǔ)言廣泛應(yīng)用于底層的軟件開(kāi)發(fā)

二、第一個(gè)C語(yǔ)言程序

代碼

#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 。stdio--standard input output--標(biāo)準(zhǔn)輸入輸出函數(shù)

?程序運(yùn)行

在菜單欄中有 調(diào)試--開(kāi)始執(zhí)行(快捷鍵Ctrl+F5)

一個(gè)工程中出現(xiàn)兩個(gè)及以上的main函數(shù)

我們用一段代碼來(lái)驗(yàn)證一下

代碼

#include int main(){	printf("Hello world!");	return 0;}int main(){	printf("Hello world!");	return 0;}

運(yùn)行結(jié)果

?編譯器報(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)去是不確定的。

三、數(shù)據(jù)類(lèi)型

我們?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)型。

數(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ù)

為什么會(huì)有這么多的數(shù)據(jù)類(lèi)型?

我們的生活中本來(lái)就有很多種數(shù)據(jù)類(lèi)型,在寫(xiě)代碼的時(shí)候,我們選擇合適的數(shù)據(jù)類(lèi)型去創(chuàng)建變量,解決問(wèn)題,使得空間利用率更高,并且更加豐富的表達(dá)生活中的各種值。

計(jì)算機(jī)單位

?各個(gè)數(shù)據(jù)類(lèi)型的大小

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é)果:

?注意事項(xiàng)

(注意: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)型的使用

選擇合適的數(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)表示

變量的分類(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)需要注意:

  1. 花括號(hào)外面的為全局變量,花括號(hào)里面的為局部變量
  2. 當(dāng)全局變量與局部變量名字相同時(shí),局部變量?jī)?yōu)先
  3. 局部變量和全局變量的名字建議不要相同--容易誤會(huì),產(chǎn)生bug

變量的使用

#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ù),也是要引頭文件。按用戶(hù)指定的格式從鍵盤(pán)上把數(shù)據(jù)輸入到指定的變量之中,這行代碼就是讓用戶(hù)從鍵盤(pán)輸入兩個(gè)整數(shù)到n1和n2的空間當(dāng)中,%d表示以整數(shù)形式進(jìn)行輸入;后面的&n1表示取地址n1,將輸入的第一個(gè)整數(shù)存儲(chǔ)到n1的空間中,&n2也是如此。一句話概括就是通過(guò)鍵盤(pán)給程序中的變量賦值。

注意事項(xiàng):

  1. 在 scanf 的“輸入?yún)?shù)”中,變量前面的取地址符&不要忘記
  2. “輸出控制符”和“輸出參數(shù)”無(wú)論在“順序上”還是在“個(gè)數(shù)上”一定要一一對(duì)應(yīng)。
  3. “輸入控制符”的類(lèi)型和變量所定義的類(lèi)型一定要一致。對(duì)于從鍵盤(pán)輸入的數(shù)據(jù)的類(lèi)型,數(shù)據(jù)是用戶(hù)輸入的,開(kāi)發(fā)者是無(wú)法決定的,所以在寫(xiě)程序時(shí)要考慮容錯(cuò)處理。
  4. 使用 scanf 之前先用 printf 提示輸入

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è)變量哪里可以使用,哪里可以起作用,哪里就是它的作用域

  1. ?局部變量的作用域是變量所在的局部范圍。
  2. ?全局變量的作用域是整個(gè)工程。

生命周期:變量的生命周期指的是變量的創(chuàng)建到變量的銷(xiāo)毀之間的一個(gè)時(shí)間段

  1. 局部變量的生命周期是:進(jìn)入作用域生命周期開(kāi)始,出作用域生命周期結(jié)束
  2. 全局變量的生命周期是:整個(gè)程序的生命周期。

可以通過(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ǔ)言中的常量分為以下幾種:

  • 字面常量
  • const修飾的常變量
  • #define定義的標(biāo)識(shí)符常量
  • 枚舉常量

通過(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。

五、字符串+轉(zhuǎn)義字符+注釋

字符串

我們首先來(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;頭文件為? 通過(guò)以下代碼來(lái)理解:

?我們會(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é)果:

?轉(zhuǎn)義字符

前面我們見(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)義字符:

C語(yǔ)言轉(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垂直制表符
/ffffdffffd表示1~3個(gè)八進(jìn)制的數(shù)字。 如: /130 X
/xdddd表示2個(gè)十六進(jìn)制數(shù)字。 如: /x30 0

對(duì)以上的轉(zhuǎn)義字符解釋?zhuān)?/p>

  1. /?? 這個(gè)轉(zhuǎn)義字符來(lái)源于三字母詞----??),編譯器在編譯的時(shí)候總會(huì)將??)打印為],而我們?nèi)绻胍屵@里的?就只是一個(gè)普通的?,就可以寫(xiě)成/??)這樣的話第一個(gè)問(wèn)號(hào)它就會(huì)被打印為問(wèn)號(hào),要想兩個(gè)?都被打印出來(lái),可以寫(xiě)成/?/?)即可
  2. /"??我們通過(guò)以下代碼對(duì)比來(lái)學(xué)習(xí)這個(gè)轉(zhuǎn)義字符

代碼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

?

注釋

  1. 代碼中有不需要的代碼可以直接刪除,也可以注釋掉
  2. 代碼中有些代碼比較難懂,可以加一下注釋文字

注意:

C語(yǔ)言風(fēng)格的注釋?zhuān)?*xxxxxx*/存在缺陷,不能嵌套注釋,嵌套注釋就會(huì)出問(wèn)題

C++風(fēng)格的注釋?zhuān)?/xxxxxxx,可以注釋一行,也可以注釋多行

六、選擇語(yǔ)句

我們的生活中總是面臨著各種各樣的選擇,怎么選就看自己了

通過(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án)語(yǔ)句

在我們色生活中也會(huì)有很多的事情都在重復(fù),eg.起床,干飯,學(xué)習(xí),睡覺(jué)

?C語(yǔ)言里面有3種循環(huán)

  • while語(yǔ)句
  • for語(yǔ)句
  • do……while語(yǔ)句

?通過(guò)以下代碼來(lái)體驗(yàn)一下

?八、函數(shù)

在數(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í)就是一組數(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)型元素的集合。

定義數(shù)組

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)看看:

數(shù)組的使用

?關(guān)于數(shù)組:

  1. 數(shù)組首元素的下標(biāo)為0
  2. 通過(guò)下標(biāo)來(lái)訪問(wèn)數(shù)組

如果要將數(shù)組中的某個(gè)元素打印出來(lái)呢?代碼如下:

?全部打印呢?

?代碼中我們通過(guò)一個(gè)while循環(huán)來(lái)實(shí)現(xiàn)打印數(shù)組中的全部?jī)?nèi)容(每次打印一個(gè)元素)

十、操作符

  • 算數(shù)操作符

+? ? -? ? *? ? /? ? %

  • 移位操作符

>>? ? <<

  • ?位操作符

&? ? ^? ? |

  • 賦值操作符

=? ? +=? ? -=? ? *=? ? /=? ? &=? ? ^=? ? |=? ? >>=? ? <<=

  • 單目操作符

!? ? ? ? ? ? ? ? ? ? ? ? ? 邏輯反操作
-? ? ? ? ? ? ? ? ? ? ? ? ? 負(fù)值
+? ? ? ? ? ? ? ? ? ? ? ? ?正值
&? ? ? ? ? ? ? ? ? ? ? ? ?取地址
sizeof? ? ? ? ? ? ? ? ? 操作數(shù)的類(lèi)型長(zhǎng)度(以字節(jié)為單位)
~? ? ? ? ? ? ? ? ? ? ? ? ? 對(duì)一個(gè)數(shù)的二進(jìn)制按位取反
--? ? ? ? ? ? ? ? ? ? ? ? ?前置、后置--
++? ? ? ? ? ? ? ? ? ? ? ?前置、后置++
*? ? ? ? ? ? ? ? ? ? ? ? ? 間接訪問(wèn)操作符(解引用操作符)
(類(lèi)型)? ? ? ? ? ? ? ? ? 強(qiáng)制類(lèi)型轉(zhuǎn)換

  • 關(guān)系操作符

>
>=
<
<=
!=? ? ? ? ? ? ? ? ? ? ? ? ?用于測(cè)試“不相等”
==? ? ? ? ? ? ? ? ? ? ? ? 用于測(cè)試“相等”

  • 邏輯操作符

&&? ? ? ? ? ? ? ? ? ? ? ? 邏輯與
||? ? ? ? ? ? ? ? ? ? ? ? ? ?邏輯或

  • 條件操作符

exp1 ? exp2 : exp3

  • 逗號(hào)表達(dá)式

exp1, exp2, exp3, …expN

  • 下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員

[]? ? ?()? ? ?.? ? ?->

這些操作符我們后面還會(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)理解

?注意:

  1. 整數(shù)在內(nèi)存中存的是二進(jìn)制補(bǔ)碼
  2. 正整數(shù)的原碼,反碼,補(bǔ)碼相同

以下代碼

#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)傳參

十一、常見(jiàn)關(guān)鍵字

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)鍵字

十二、#define 定義常量和宏

#define定義的標(biāo)識(shí)符常量

通過(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

相關(guān)文章

  • ??擼完這個(gè)springboot項(xiàng)目,我對(duì)boot輕車(chē)熟路!【源碼+視頻都開(kāi)源】【強(qiáng)烈建議收藏】??

    上次給大家分享了一個(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ù)...

    AZmake 評(píng)論0 收藏0
  • ??爆肝十二萬(wàn)字《python從零到精通教程》,從零教你變大佬??建議收藏

    文章目錄 強(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...

    booster 評(píng)論0 收藏0
  • ????新生代農(nóng)民工爆肝8萬(wàn)字,整理Python編程從入門(mén)到實(shí)踐(建議收藏)已碼:6萬(wàn)字????

    人生苦短,我用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()方法字符串格式化...

    wthee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<