偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C語(yǔ)言該怎么進(jìn)階?你學(xué)會(huì)了嗎?

開(kāi)發(fā) 前端
初學(xué)者在這段代碼里出的錯(cuò)誤,基本都是忘了打結(jié)尾的分號(hào),或者使用了中文字符而導(dǎo)致的。學(xué)會(huì)了這段代碼之后,C語(yǔ)言就可以算入門了。

?C語(yǔ)言的入門還是很簡(jiǎn)單的:

#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}

把這段代碼輸入文本編輯器vim,保存成hello.c文件:文件里的符號(hào)全是英文字符,別把分號(hào)打成中文字符。

然后用gcc編譯器它,命令為:gcc hello.c

獲得一個(gè)可運(yùn)行的a.out文件,在命令行里直接運(yùn)行它:./a.out

可以看到打印的hello world字符串。

如果gcc編譯出來(lái)的a.out文件沒(méi)有自動(dòng)加執(zhí)行權(quán)限,可以自己加上,命令為:

chmod +x a.out

初學(xué)者在這段代碼里出的錯(cuò)誤,基本都是忘了打結(jié)尾的分號(hào),或者使用了中文字符而導(dǎo)致的。

學(xué)會(huì)了這段代碼之后,C語(yǔ)言就可以算入門了。

這段代碼雖然很短,但涉及到了頭文件、宏、函數(shù)、字符串/數(shù)字 常量、return 語(yǔ)句,涵蓋了C語(yǔ)言50%的常用語(yǔ)法吧?

剩下的語(yǔ)法,就是一些運(yùn)算符、if else、while for、switch case等語(yǔ)句類型。

1.C語(yǔ)言入門階段的最后一關(guān),是指針。

指針,是一個(gè)表示變量的內(nèi)存地址的無(wú)符號(hào)整數(shù),位數(shù)跟CPU的字長(zhǎng)相同。

64位機(jī)上,指針是8個(gè)字節(jié)。

老式的32位機(jī)上,指針是4個(gè)字節(jié)。

指針的字節(jié)數(shù),跟long類型的整數(shù)一樣。

int a[10];
int * p = a;

數(shù)組的指針,指的是數(shù)組的“首地址”:數(shù)組的第0號(hào)元素的內(nèi)存地址。

C語(yǔ)言從0開(kāi)始編號(hào),數(shù)組元素的內(nèi)存地址與它的編號(hào)一一對(duì)應(yīng):

&a[i] == (unsigned long)a + i * sizeof(a[0]);

所以,指針是一個(gè)unsigned long型的(無(wú)符號(hào))整數(shù)。

指針變量,是一個(gè)保存某種類型的數(shù)據(jù)的內(nèi)存地址的變量。

指針的類型,是它指向的數(shù)據(jù)的類型。

指針的++和--運(yùn)算,一次跳過(guò)(它指向的)1個(gè)元素的字節(jié)數(shù):int型指針++和--的變化是sizeof(int)個(gè)字節(jié)。

大多數(shù)系統(tǒng)上,sizeof(int) == 4.

2.C語(yǔ)言的文件讀寫(xiě),是關(guān)系到操作系統(tǒng)的。

C語(yǔ)言的文件函數(shù)

上圖是C語(yǔ)言的文件函數(shù),下圖是Linux的文件函數(shù)。

C語(yǔ)言標(biāo)準(zhǔn)庫(kù)的文件函數(shù),最終也是使用OS的系統(tǒng)調(diào)用(其他語(yǔ)言的標(biāo)準(zhǔn)庫(kù)也一樣)。

操作系統(tǒng)為了把功能提供給應(yīng)用層,都有一套API:其中的重點(diǎn)就是文件和網(wǎng)絡(luò)編程的API。

API這個(gè)詞來(lái)自windows,Linux上一般叫系統(tǒng)調(diào)用(syscall)。

Linux的文件函數(shù)

windows有它自己的應(yīng)用編程框架(C#,VS),windows上的C語(yǔ)言都是通過(guò)VC++支持的:VC++,VS里的C++?

現(xiàn)在,C語(yǔ)言的應(yīng)用編程,主要還是在Linux上。

Linux的系統(tǒng)調(diào)用,是C程序員在學(xué)會(huì)了基礎(chǔ)內(nèi)容之后,下一個(gè)階段要熟悉的。

Linux繼承的是Unix,它的API和Unix的區(qū)別不大:

要熟悉Linux系統(tǒng),最好的參考資料還是那本老書(shū):Unix環(huán)境高級(jí)編程?

這本書(shū)的作者理查德-史蒂文斯1999年就過(guò)世了,但他的書(shū)依然是最好的Linux編程書(shū)。

當(dāng)然,最主要的參考資料還是Linux的man手冊(cè):在命令行里輸入man open,就可以打開(kāi)open()函數(shù)的手冊(cè),里面有open()函數(shù)的詳細(xì)用法。

把man open換成man socket,就可以打開(kāi)socket函數(shù)的手冊(cè)。

對(duì)同一個(gè)詞的介紹,在man手冊(cè)里可能有好幾頁(yè):一個(gè)是對(duì)同名的Linux命令的介紹,另一個(gè)是對(duì)同名的Linux函數(shù)的介紹。

如果直接man open打開(kāi)的不是函數(shù)介紹,可以用man 2 open,或者man 3 open等,通過(guò)數(shù)字去選頁(yè)數(shù)。

3.Linux的常用函數(shù):

1)open, close, read, write, fcntl

這些都是跟文件相關(guān)的函數(shù),作用跟函數(shù)名一樣。

fcntl:可以給文件加鎖,給socket設(shè)置非阻塞,用法比較復(fù)雜,可以參考man手冊(cè)。

2)lseek

移動(dòng)文件指針到哪個(gè)位置,用法跟C庫(kù)的fseek一樣。

3)socket, bind, listen, accept, connect, send / recv, sendto / recvfrom

這些都是網(wǎng)絡(luò)編程的API,

socket:創(chuàng)建socket描述符,即網(wǎng)絡(luò)文件的句柄。

Linux上一切都是文件,socket也被看做一個(gè)文件。

bind:綁定socket到某個(gè)IP和端口號(hào)。

listen:讓socket進(jìn)入監(jiān)聽(tīng)狀態(tài),用于服務(wù)器端監(jiān)聽(tīng)某個(gè)IP和端口號(hào)。

accept:用于服務(wù)器端接受用戶的連接。

connect:用于客戶端連接到服務(wù)器。

send / recv:TCP協(xié)議的數(shù)據(jù)發(fā)送和接收。

sendto / recvfrom:UDP協(xié)議的數(shù)據(jù)發(fā)送和接收。

關(guān)閉socket,也是使用close()函數(shù)。

4)epoll_create, epoll_wait, epoll_ctl

Linux的epoll異步事件機(jī)制,

用于同時(shí)監(jiān)控多個(gè)socket網(wǎng)絡(luò)連接的讀寫(xiě)狀態(tài),并進(jìn)行高并發(fā)的異步處理,它是網(wǎng)絡(luò)服務(wù)器的核心函數(shù)。

俄羅斯人寫(xiě)的Nginx服務(wù)器,底層就是這3個(gè)函數(shù)。

nginx

5)setsockopt / getsockopt

設(shè)置或讀取網(wǎng)絡(luò)socket的狀態(tài),細(xì)節(jié)參考Linux man手冊(cè)。

getsockopt的其中一個(gè)應(yīng)用就是,它在異步連接時(shí)用于讀取連接的錯(cuò)誤碼:相當(dāng)于connect()函數(shù)的返回值,只是這個(gè)過(guò)程在異步獲取的。

6)fork / execve

fork:以當(dāng)前進(jìn)程為藍(lán)本,創(chuàng)建一個(gè)子進(jìn)程。

execve:給當(dāng)前進(jìn)程加載一個(gè)新的可執(zhí)行程序,并替換它的用戶內(nèi)存空間。

在多進(jìn)程編程里,這2個(gè)是基本的函數(shù),但一般并不常用。

多進(jìn)程的網(wǎng)絡(luò)服務(wù)器Nginx,就是用fork()創(chuàng)建多個(gè)進(jìn)程的。

7)pthread_create

Linux上的pthread線程庫(kù)的函數(shù),用于在當(dāng)前進(jìn)程里創(chuàng)建一個(gè)線程。

pthread系列函數(shù),也是一組跟多線程編程的函數(shù)。

4.匯編語(yǔ)言

不會(huì)匯編語(yǔ)言的C程序員,不是好程序員?

實(shí)際上,想學(xué)明白C語(yǔ)言的話,還是要學(xué)匯編語(yǔ)言。

不會(huì)匯編語(yǔ)言的話,像全局變量、局部變量、動(dòng)態(tài)庫(kù)、內(nèi)存、操作系統(tǒng)這些跟C語(yǔ)言有關(guān)的東西,也是很難學(xué)明白的。

C語(yǔ)言,既是個(gè)大號(hào)的匯編語(yǔ)言,又是個(gè)OS的應(yīng)用層膠水。

C語(yǔ)言,既離不了匯編語(yǔ)言,也離不了OS。

匯編語(yǔ)言就3個(gè)關(guān)鍵:內(nèi)存、寄存器、棧。

這條匯編代碼運(yùn)行之前,內(nèi)存什么狀態(tài)、寄存器什么狀態(tài)、棧是什么狀態(tài)?

這條匯編代碼運(yùn)行之后,內(nèi)存什么狀態(tài),寄存器什么狀態(tài),棧是什么狀態(tài)?

記住這6個(gè)狀態(tài),也就學(xué)會(huì)了匯編語(yǔ)言了。

5.算法

算法關(guān)系到數(shù)學(xué),算法導(dǎo)論是最好的參考資料。

當(dāng)然,數(shù)學(xué)越好,越容易學(xué)算法。

但OpenCV開(kāi)源之后,大多數(shù)情況下,用不到自己寫(xiě)算法?

跟圖像處理、視覺(jué)識(shí)別相關(guān)的算法,OpenCV幾乎都有。

算法工程師做的,更多是把這些基礎(chǔ)算法整合成一個(gè)特定場(chǎng)景的識(shí)別模型。

6.圖形界面

C語(yǔ)言可以選各種圖形界面庫(kù),例如GTK,SDL,QT,etc.

想做界面程序的話,選一種自己看著順眼的圖形庫(kù),然后熟悉一下它的C語(yǔ)言API就行了。

一般來(lái)說(shuō),圖形庫(kù)的API都是支持多種語(yǔ)言的,C語(yǔ)言也是其中之一。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2024-05-09 08:14:09

系統(tǒng)設(shè)計(jì)語(yǔ)言多語(yǔ)言

2023-08-08 08:23:08

Spring日志?線程池

2023-08-01 12:51:18

WebGPT機(jī)器學(xué)習(xí)模型

2024-01-02 12:05:26

Java并發(fā)編程

2022-11-09 07:20:43

調(diào)用日志502報(bào)錯(cuò)nginx

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺(tái)工具

2023-01-10 08:43:15

定義DDD架構(gòu)

2024-09-10 10:34:48

2024-12-31 00:08:37

C#語(yǔ)言dynamic?

2024-03-06 08:28:16

設(shè)計(jì)模式Java

2022-06-16 07:50:35

數(shù)據(jù)結(jié)構(gòu)鏈表

2022-12-06 07:53:33

MySQL索引B+樹(shù)

2023-01-31 08:02:18

2023-10-06 14:49:21

SentinelHystrixtimeout

2022-07-13 08:16:49

RocketMQRPC日志

2023-05-05 06:54:07

MySQL數(shù)據(jù)查詢

2023-06-26 13:08:52

GraphQL服務(wù)數(shù)據(jù)

2023-07-30 22:29:51

BDDMockitoAssert測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)