精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

哦!這該死的 C 語言

開發(fā) 后端
C 語言是一門抽象的、面向過程的語言,C 語言廣泛應(yīng)用于底層開發(fā),C 語言在計算機體系中占據(jù)著不可替代的作用,可以說 C 語言是編程的基礎(chǔ),也就是說,不管你學(xué)習(xí)任何語言,都應(yīng)該把 C 語言放在首先要學(xué)的位置上。

前言

C 語言是一門抽象的、面向過程的語言,C 語言廣泛應(yīng)用于底層開發(fā),C 語言在計算機體系中占據(jù)著不可替代的作用,可以說 C 語言是編程的基礎(chǔ),也就是說,不管你學(xué)習(xí)任何語言,都應(yīng)該把 C 語言放在首先要學(xué)的位置上。下面這張圖更好的說明 C 語言的重要性

 

哦!這該死的 C 語言

可以看到,C 語言是一種底層語言,是一種系統(tǒng)層級的語言,操作系統(tǒng)就是使用 C 語言來編寫的,比如 Windows、Linux、UNIX 。如果說其他語言是光鮮亮麗的外表,那么 C 語言就是靈魂,永遠那么樸實無華。

C 語言特性

那么,既然 C 語言這么重要,它有什么值得我們?nèi)W(xué)的地方呢?我們不應(yīng)該只因為它重要而去學(xué),我們更在意的是學(xué)完我們能學(xué)會什么,能讓我們獲得什么。

C 語言的設(shè)計

C 語言是 1972 年,由貝爾實驗室的丹尼斯·里奇(Dennis Ritch)和肯·湯普遜(Ken Thompson)在開發(fā) UNIX 操作系統(tǒng)時設(shè)計了C語言。C 語言是一門流行的語言,它把計算機科學(xué)理論和工程實踐理論完美的融合在一起,使用戶能夠完成模塊化的編程和設(shè)計。

計算機科學(xué)理論:簡稱 CS、是系統(tǒng)性研究信息與計算的理論基礎(chǔ)以及它們在計算機系統(tǒng)中如何實現(xiàn)與應(yīng)用的實用技術(shù)的學(xué)科。

C 語言具有高效性

  • C 語言是一門高效性語言,它被設(shè)計用來充分發(fā)揮計算機的優(yōu)勢,因此 C 語言程序運行速度很快,C 語言能夠合理了使用內(nèi)存來獲得最大的運行速度
  • C 語言具有可移植性
  • C 語言是一門具有可移植性的語言,這就意味著,對于在一臺計算機上編寫的 C 語言程序可以在另一臺計算機上輕松地運行,從而極大的減少了程序移植的工作量。

C 語言特點

  • C 語言是一門簡潔的語言,因為 C 語言設(shè)計更加靠近底層,因此不需要眾多 Java 、C# 等高級語言才有的特性,程序的編寫要求不是很嚴格。
  • C 語言具有結(jié)構(gòu)化控制語句,C 語言是一門結(jié)構(gòu)化的語言,它提供的控制語句具有結(jié)構(gòu)化特征,如 for 循環(huán)、if⋯ else 判斷語句和 switch 語句等。
  • C 語言具有豐富的數(shù)據(jù)類型,不僅包含有傳統(tǒng)的字符型、整型、浮點型、數(shù)組類型等數(shù)據(jù)類型,還具有其他編程語言所不具備的數(shù)據(jù)類型,比如指針。
  • C 語言能夠直接對內(nèi)存地址進行讀寫,因此可以實現(xiàn)匯編語言的主要功能,并可直接操作硬件。
  • C 語言速度快,生成的目標代碼執(zhí)行效率高。

下面讓我們通過一個簡單的示例來說明一下 C 語言

入門級 C 語言程序

下面我們來看一個很簡單的 C 語言程序,我是 mac 電腦,所以我使用的是 xcode 進行開發(fā),我覺得工具無所謂大家用著順手就行。

第一個 C 語言程序

 

  1. #include <stdio.h> 
  2.  
  3. int main(int argc, const char * argv[]) { 
  4.     printf("Hello, World!\n"); 
  5.    
  6.     printf("my Name is cxuan \n"
  7.      
  8.     printf("number = %d \n", number); 
  9.      
  10.     return 0; 

你可能不知道這段代碼是什么意思,不過別著急,我們先運行一下看看結(jié)果。

 

哦!這該死的 C 語言

這段程序輸出了 Hello,World! 和 My Name is cxuan,最后一行是程序的執(zhí)行結(jié)果,表示這段程序是否有錯誤。下面我們解釋一下各行代碼的含義。

首先,第一行的 #include , 這行代碼包含另一個文件,這一行告訴編譯器把 stdio.h 的內(nèi)容包含在當前程序中。 stdio.h 是 C 編譯器軟件包的標準部分,它能夠提供鍵盤輸入和顯示器輸出。

  • 什么是 C 標準軟件包?C 是由 Dennis M 在1972年開發(fā)的通用,過程性,命令式計算機編程語言。C標準庫是一組 C 語言內(nèi)置函數(shù),常量和頭文件,例如,,等。此庫將用作 C 程序員的參考手冊。

我們后面會介紹 stdio.h ,現(xiàn)在你知道它是什么就好。

在 stdio.h 下面一行代碼就是 main 函數(shù)。

C 程序能夠包含一個或多個函數(shù),函數(shù)是 C 語言的根本,就和方法是 Java 的基本構(gòu)成一樣。main() 表示一個函數(shù)名,int 表示的是 main 函數(shù)返回一個整數(shù)。void 表明 main() 不帶任何參數(shù)。這些我們后面也會詳細說明,只需要記住 int 和 void 是標準 ANSI C 定義 main() 的一部分(如果使用 ANSI C 之前的編譯器,請忽略 void)。

然后是 /*一個簡單的 C 語言程序*/ 表示的是注釋,注釋使用 /**/ 來表示,注釋的內(nèi)容在兩個符號之間。這些符號能夠提高程序的可讀性。

注意:注釋只是為了幫助程序員理解代碼的含義,編譯器會忽略注釋

下面就是 { ,這是左花括號,它表示的是函數(shù)體的開始,而最后的右花括號 } 表示函數(shù)體的結(jié)束。 { } 中間是書寫代碼的地方,也叫做代碼塊。

int number 表示的是將會使用一個名為 number 的變量,而且 number 是 int 整數(shù)類型。

number = 11 表示的是把值 11 賦值給 number 的變量。

printf(Hello,world!\n); 表示調(diào)用一個函數(shù),這個語句使用 printf() 函數(shù),在屏幕上顯示 Hello,world , printf() 函數(shù)是 C 標準庫函數(shù)中的一種,它能夠把程序運行的結(jié)果輸出到顯示器上。而代碼 \n 表示的是 換行,也就是另起一行,把光標移到下一行。

然后接下來的一行 printf() 和上面一行是一樣的,我們就不多說了。最后一行 printf() 有點意思,你會發(fā)現(xiàn)有一個 %d 的語法,它的意思表示的是使用整形輸出字符串。

代碼塊的最后一行是 return 0,它可以看成是 main 函數(shù)的結(jié)束,最后一行是代碼塊 } ,它表示的是程序的結(jié)束。

好了,我們現(xiàn)在寫完了第一個 C 語言程序,有沒有對 C 有了更深的認識呢?肯定沒有。。。這才哪到哪,繼續(xù)學(xué)習(xí)吧。

現(xiàn)在,我們可以歸納為 C 語言程序的幾個組成要素,如下圖所示

 

哦!這該死的 C 語言

C 語言執(zhí)行流程

C 語言程序成為高級語言的原因是它能夠讀取并理解人們的思想。然而,為了能夠在系統(tǒng)中運行 hello.c 程序,則各個 C 語句必須由其他程序轉(zhuǎn)換為一系列低級機器語言指令。這些指令被打包作為可執(zhí)行對象程序,存儲在二進制磁盤文件中。目標程序也稱為可執(zhí)行目標文件。

在 UNIX 系統(tǒng)中,從源文件到對象文件的轉(zhuǎn)換是由編譯器執(zhí)行完成的。

  1. gcc -o hello hello.c 

gcc 編譯器驅(qū)動從源文件讀取 hello.c ,并把它翻譯成一個可執(zhí)行文件 hello。這個翻譯過程可用如下圖來表示

 

哦!這該死的 C 語言

這就是一個完整的 hello world 程序執(zhí)行過程,會涉及幾個核心組件:預(yù)處理器、編譯器、匯編器、連接器,下面我們逐個擊破。

  • 預(yù)處理階段(Preprocessing phase),預(yù)處理器會根據(jù)開始的 # 字符,修改源 C 程序。#include 命令就會告訴預(yù)處理器去讀系統(tǒng)頭文件 stdio.h 中的內(nèi)容,并把它插入到程序作為文本。然后就得到了另外一個 C 程序hello.i,這個程序通常是以 .i為結(jié)尾。
  • 然后是 編譯階段(Compilation phase),編譯器會把文本文件 hello.i 翻譯成文本hello.s,它包括一段匯編語言程序(assembly-language program)。
  • 編譯完成之后是匯編階段(Assembly phase),這一步,匯編器 as會把 hello.s 翻譯成機器指令,把這些指令打包成可重定位的二進制程序(relocatable object program)放在 hello.c 文件中。它包含的 17 個字節(jié)是函數(shù) main 的指令編碼,如果我們在文本編輯器中打開 hello.o 將會看到一堆亂碼。
  • 最后一個是鏈接階段(Linking phase),我們的 hello 程序會調(diào)用 printf 函數(shù),它是 C 編譯器提供的 C 標準庫中的一部分。printf 函數(shù)位于一個叫做 printf.o文件中,它是一個單獨的預(yù)編譯好的目標文件,而這個文件必須要和我們的 hello.o 進行鏈接,連接器(ld) 會處理這個合并操作。結(jié)果是,hello 文件,它是一個可執(zhí)行的目標文件(或稱為可執(zhí)行文件),已準備好加載到內(nèi)存中并由系統(tǒng)執(zhí)行。

你需要理解編譯系統(tǒng)做了什么

對于上面這種簡單的 hello 程序來說,我們可以依賴編譯系統(tǒng)(compilation system)來提供一個正確和有效的機器代碼。然而,對于我們上面講的程序員來說,編譯器有幾大特征你需要知道

  • 優(yōu)化程序性能(Optimizing program performance),現(xiàn)代編譯器是一種高效的用來生成良好代碼的工具。對于程序員來說,你無需為了編寫高質(zhì)量的代碼而去理解編譯器內(nèi)部做了什么工作。然而,為了編寫出高效的 C 語言程序,我們需要了解一些基本的機器碼以及編譯器將不同的 C 語句轉(zhuǎn)化為機器代碼的過程。
  • 理解鏈接時出現(xiàn)的錯誤(Understanding link-time errors),在我們的經(jīng)驗中,一些非常復(fù)雜的錯誤大多是由鏈接階段引起的,特別是當你想要構(gòu)建大型軟件項目時。
  • 避免安全漏洞(Avoiding security holes),近些年來,緩沖區(qū)溢出(buffer overflow vulnerabilities)是造成網(wǎng)絡(luò)和 Internet 服務(wù)的罪魁禍首,所以我們有必要去規(guī)避這種問題。

系統(tǒng)硬件組成

為了理解 hello 程序在運行時發(fā)生了什么,我們需要首先對系統(tǒng)的硬件有一個認識。下面這是一張 Intel 系統(tǒng)產(chǎn)品的模型,我們來對其進行解釋

 

哦!這該死的 C 語言
  • 總線(Buses):在整個系統(tǒng)中運行的是稱為總線的電氣管道的集合,這些總線在組件之間來回傳輸字節(jié)信息。通常總線被設(shè)計成傳送定長的字節(jié)塊,也就是 字(word)。字中的字節(jié)數(shù)(字長)是一個基本的系統(tǒng)參數(shù),各個系統(tǒng)中都不盡相同。現(xiàn)在大部分的字都是 4 個字節(jié)(32 位)或者 8 個字節(jié)(64 位)。

 

哦!這該死的 C 語言
  • I/O 設(shè)備(I/O Devices):Input/Output 設(shè)備是系統(tǒng)和外部世界的連接。上圖中有四類 I/O 設(shè)備:用于用戶輸入的鍵盤和鼠標,用于用戶輸出的顯示器,一個磁盤驅(qū)動用來長時間的保存數(shù)據(jù)和程序。剛開始的時候,可執(zhí)行程序就保存在磁盤上。每個I/O 設(shè)備連接 I/O 總線都被稱為控制器(controller) 或者是 適配器(Adapter)。控制器和適配器之間的主要區(qū)別在于封裝方式。控制器是 I/O 設(shè)備本身或者系統(tǒng)的主印制板電路(通常稱作主板)上的芯片組。而適配器則是一塊插在主板插槽上的卡。無論組織形式如何,它們的最終目的都是彼此交換信息。
  • 主存(Main Memory),主存是一個臨時存儲設(shè)備,而不是永久性存儲,磁盤是 永久性存儲 的設(shè)備。主存既保存程序,又保存處理器執(zhí)行流程所處理的數(shù)據(jù)。從物理組成上說,主存是由一系列 DRAM(dynamic random access memory) 動態(tài)隨機存儲構(gòu)成的集合。邏輯上說,內(nèi)存就是一個線性的字節(jié)數(shù)組,有它唯一的地址編號,從 0 開始。一般來說,組成程序的每條機器指令都由不同數(shù)量的字節(jié)構(gòu)成,C 程序變量相對應(yīng)的數(shù)據(jù)項的大小根據(jù)類型進行變化。比如,在 Linux 的 x86-64 機器上,short 類型的數(shù)據(jù)需要 2 個字節(jié),int 和 float 需要 4 個字節(jié),而 long 和 double 需要 8 個字節(jié)。
  • 處理器(Processor),CPU(central processing unit) 或者簡單的處理器,是解釋(并執(zhí)行)存儲在主存儲器中的指令的引擎。處理器的核心大小為一個字的存儲設(shè)備(或寄存器),稱為程序計數(shù)器(PC)。在任何時刻,PC 都指向主存中的某條機器語言指令(即含有該條指令的地址)。從系統(tǒng)通電開始,直到系統(tǒng)斷電,處理器一直在不斷地執(zhí)行程序計數(shù)器指向的指令,再更新程序計數(shù)器,使其指向下一條指令。處理器根據(jù)其指令集體系結(jié)構(gòu)定義的指令模型進行操作。在這個模型中,指令按照嚴格的順序執(zhí)行,執(zhí)行一條指令涉及執(zhí)行一系列的步驟。處理器從程序計數(shù)器指向的內(nèi)存中讀取指令,解釋指令中的位,執(zhí)行該指令指示的一些簡單操作,然后更新程序計數(shù)器以指向下一條指令。指令與指令之間可能連續(xù),可能不連續(xù)(比如 jmp 指令就不會順序讀取)下面是 CPU 可能執(zhí)行簡單操作的幾個步驟
  • 加載(Load):從主存中拷貝一個字節(jié)或者一個字到內(nèi)存中,覆蓋寄存器先前的內(nèi)容
  • 存儲(Store):將寄存器中的字節(jié)或字復(fù)制到主存儲器中的某個位置,從而覆蓋該位置的先前內(nèi)容
  • 操作(Operate):把兩個寄存器的內(nèi)容復(fù)制到 ALU(Arithmetic logic unit) 。把兩個字進行算術(shù)運算,并把結(jié)果存儲在寄存器中,重寫寄存器先前的內(nèi)容。

算術(shù)邏輯單元(ALU)是對數(shù)字二進制數(shù)執(zhí)行算術(shù)和按位運算的組合數(shù)字電子電路。

  • 跳轉(zhuǎn)(jump):從指令中抽取一個字,把這個字復(fù)制到程序計數(shù)器(PC) 中,覆蓋原來的值

剖析 hello 程序的執(zhí)行過程

前面我們簡單的介紹了一下計算機的硬件的組成和操作,現(xiàn)在我們正式介紹運行示例程序時發(fā)生了什么,我們會從宏觀的角度進行描述,不會涉及到所有的技術(shù)細節(jié)

剛開始時,shell 程序執(zhí)行它的指令,等待用戶鍵入一個命令。當我們在鍵盤上輸入了 ./hello 這幾個字符時,shell 程序?qū)⒆址鹨蛔x入寄存器,再把它放到內(nèi)存中,如下圖所示

 

哦!這該死的 C 語言

當我們在鍵盤上敲擊回車鍵的時候,shell 程序就知道我們已經(jīng)結(jié)束了命令的輸入。然后 shell 執(zhí)行一系列指令來加載可執(zhí)行的 hello 文件,這些指令將目標文件中的代碼和數(shù)據(jù)從磁盤復(fù)制到主存。

利用 DMA(Direct Memory Access) 技術(shù)可以直接將磁盤中的數(shù)據(jù)復(fù)制到內(nèi)存中,如下

 

哦!這該死的 C 語言

一旦目標文件中 hello 中的代碼和數(shù)據(jù)被加載到主存,處理器就開始執(zhí)行 hello 程序的 main 程序中的機器語言指令。這些指令將 hello,world\n 字符串中的字節(jié)從主存復(fù)制到寄存器文件,再從寄存器中復(fù)制到顯示設(shè)備,最終顯示在屏幕上。如下所示

 

哦!這該死的 C 語言

高速緩存是關(guān)鍵

上面我們介紹完了一個 hello 程序的執(zhí)行過程,系統(tǒng)花費了大量時間把信息從一個地方搬運到另外一個地方。hello 程序的機器指令最初存儲在磁盤上。當程序加載后,它們會拷貝到主存中。當 CPU 開始運行時,指令又從內(nèi)存復(fù)制到 CPU 中。同樣的,字符串數(shù)據(jù) hello,world \n 最初也是在磁盤上,它被復(fù)制到內(nèi)存中,然后再到顯示器設(shè)備輸出。從程序員的角度來看,這種復(fù)制大部分是開銷,這減慢了程序的工作效率。因此,對于系統(tǒng)設(shè)計來說,最主要的一個工作是讓程序運行的越來越快。

由于物理定律,較大的存儲設(shè)備要比較小的存儲設(shè)備慢。而由于寄存器和內(nèi)存的處理效率在越來越大,所以針對這種差異,系統(tǒng)設(shè)計者采用了更小更快的存儲設(shè)備,稱為高速緩存存儲器(cache memory, 簡稱為 cache 高速緩存),作為暫時的集結(jié)區(qū)域,存放近期可能會需要的信息。如下圖所示

 

哦!這該死的 C 語言

圖中我們標出了高速緩存的位置,位于高速緩存中的 L1高速緩存容量可以達到數(shù)萬字節(jié),訪問速度幾乎和訪問寄存器文件一樣快。容量更大的 L2 高速緩存通過一條特殊的總線鏈接 CPU,雖然 L2 緩存比 L1 緩存慢 5 倍,但是仍比內(nèi)存要哦快 5 - 10 倍。L1 和 L2 是使用一種靜態(tài)隨機訪問存儲器(SRAM) 的硬件技術(shù)實現(xiàn)的。最新的、處理器更強大的系統(tǒng)甚至有三級緩存:L1、L2 和 L3。系統(tǒng)可以獲得一個很大的存儲器,同時訪問速度也更快,原因是利用了高速緩存的 局部性原理。

Again:入門程序細節(jié)

現(xiàn)在,我們來探討一下入門級程序的細節(jié),由淺入深的來了解一下 C 語言的特性。

#include<stdio.h>

我們上面說到,#include 是程序編譯之前要處理的內(nèi)容,稱為編譯預(yù)處理命令。

預(yù)處理命令是在編譯之前進行處理。預(yù)處理程序一般以 # 號開頭。

所有的 C 編譯器軟件包都提供 stdio.h 文件。該文件包含了給編譯器使用的輸入和輸出函數(shù),比如 println() 信息。該文件名的含義是標準輸入/輸出 頭文件。通常,在 C 程序頂部的信息集合被稱為 頭文件(header)。

C 的第一個標準是由 ANSI 發(fā)布的。雖然這份文檔后來被國際標準化組織(ISO)采納并且 ISO 發(fā)布的修訂版也被 ANSI 采納了,但名稱 ANSI C(而不是 ISO C) 仍被廣泛使用。一些軟件開發(fā)者使用ISO C,還有一些使用 Standard C。

C 標準庫

除了<stdio.h> 外,C 標準庫還包括下面這些頭文件

 

哦!這該死的 C 語言

<assert>

提供了一個名為 assert 的關(guān)鍵字,它用于驗證程序作出的假設(shè),并在假設(shè)為假輸出診斷消息。

<ctype.h>

C 標準庫的 ctype.h 頭文件提供了一些函數(shù),可以用于測試和映射字符。

這些字符接受 int 作為參數(shù),它的值必須是 EOF 或者是一個無符號字符

EOF是一個計算機術(shù)語,為 End Of File 的縮寫,在操作系統(tǒng)中表示資料源無更多的資料可讀取。資料源通常稱為檔案或串流。通常在文本的最后存在此字符表示資料結(jié)束。

<errno.h>

C 標準庫的 errno.h 頭文件定義了整數(shù)變量 errno,它是通過系統(tǒng)調(diào)用設(shè)置的,這些庫函數(shù)表明了什么發(fā)生了錯誤。

<float.h>

C 標準庫的 float.h 頭文件包含了一組與浮點值相關(guān)的依賴于平臺的常量。

<limits.h>

limits.h 頭文件決定了各種變量類型的各種屬性。定義在該頭文件中的宏限制了各種變量類型(比如 char、int 和 long)的值。

<locale.h>

locale.h 頭文件定義了特定地域的設(shè)置,比如日期格式和貨幣符號

<math.h>

math.h 頭文件定義了各種數(shù)學(xué)函數(shù)和一個宏。在這個庫中所有可用的功能都帶有一個 double 類型的參數(shù),且都返回 double 類型的結(jié)果。

<setjmp.h>

setjmp.h 頭文件定義了宏 setjmp()、函數(shù) longjmp() 和變量類型 jmp_buf,該變量類型會繞過正常的函數(shù)調(diào)用和返回規(guī)則。

<signal.h>

signal.h 頭文件定義了一個變量類型 sig_atomic_t、兩個函數(shù)調(diào)用和一些宏來處理程序執(zhí)行期間報告的不同信號。

<stdarg.h>

stdarg.h 頭文件定義了一個變量類型 va_list 和三個宏,這三個宏可用于在參數(shù)個數(shù)未知(即參數(shù)個數(shù)可變)時獲取函數(shù)中的參數(shù)。

<steedf.h>

stddef .h 頭文件定義了各種變量類型和宏。這些定義中的大部分也出現(xiàn)在其它頭文件中。

<stdlib.h>

stdlib .h 頭文件定義了四個變量類型、一些宏和各種通用工具函數(shù)。

<string.h>

string .h 頭文件定義了一個變量類型、一個宏和各種操作字符數(shù)組的函數(shù)。

<time.h>

time.h 頭文件定義了四個變量類型、兩個宏和各種操作日期和時間的函數(shù)。

main() 函數(shù)

main 函數(shù)聽起來像是調(diào)皮搗蛋的孩子故意給方法名起一個 主要的 方法,來告訴他人他才是這個世界的中心。但事實卻不是這樣,而 main() 方法確實是世界的中心。

C 語言程序一定從 main() 函數(shù)開始執(zhí)行,除了 main() 函數(shù)外,你可以隨意命名其他函數(shù)。通常,main 后面的 () 中表示一些傳入信息,我們上面的那個例子中沒有傳遞信息,因為圓括號中的輸入是 void 。

除了上面那種寫法外,還有兩種 main 方法的表示方式,一種是 void main(){} ,一種是 int main(int argc, char* argv[]) {}

  • void main() 聲明了一個帶有不確定參數(shù)的構(gòu)造方法
  • int main(int argc, char* argv[]) {} 其中的 argc 是一個非負值,表示從運行程序的環(huán)境傳遞到程序的參數(shù)數(shù)量。它是指向 argc + 1 指針數(shù)組的第一個元素的指針,其中最后一個為null,而前一個(如果有的話)指向表示從主機環(huán)境傳遞給程序的參數(shù)的字符串。 如果argv [0]不是空指針(或者等效地,如果argc> 0),則指向表示程序名稱的字符串,如果在主機環(huán)境中無法使用程序名稱,則該字符串為空。

注釋

在程序中,使用 /**/ 的表示注釋,注釋對于程序來說沒有什么實際用處,但是對程序員來說卻非常有用,它能夠幫助我們理解程序,也能夠讓他人看懂你寫的程序,我們在開發(fā)工作中,都非常反感不寫注釋的人,由此可見注釋非常重要。

 

哦!這該死的 C 語言

C 語言注釋的好處是,它可以放在任意地方,甚至代碼在同一行也沒關(guān)系。較長的注釋可以多行表示,我們使用 /**/ 表示多行注釋,而 // 只表示的是單行注釋。下面是幾種注釋的表示形式

 

  1. // 這是一個單行注釋 
  2.  
  3. /* 多行注釋用一行表示 */ 
  4.  
  5. /* 
  6.     多行注釋用多行表示 
  7.         多行注釋用多行表示 
  8.             多行注釋用多行表示 
  9.                 多行注釋用多行表示 
  10.  
  11. */ 

函數(shù)體

在頭文件、main 方法后面的就是函數(shù)體(注釋一般不算),函數(shù)體就是函數(shù)的執(zhí)行體,是你編寫大量代碼的地方。

變量聲明

在我們?nèi)腴T級的代碼中,我們聲明了一個名為 number 的變量,它的類型是 int,這行代碼叫做 聲明,聲明是 C 語言最重要的特性之一。這個聲明完成了兩件事情:定義了一個名為 number 的變量,定義 number 的具體類型。

int 是 C 語言的一個 關(guān)鍵字(keyword),表示一種基本的 C 語言數(shù)據(jù)類型。關(guān)鍵字是用于語言定義的。不能使用關(guān)鍵字作為變量進行定義。

示例中的 number 是一個 標識符(identifier),也就是一個變量、函數(shù)或者其他實體的名稱。

變量賦值

在入門例子程序中,我們聲明了一個 number 變量,并為其賦值為 11,賦值是 C 語言的基本操作之一。這行代碼的意思就是把值 1 賦給變量 number。在執(zhí)行 int number 時,編譯器會在計算機內(nèi)存中為變量 number 預(yù)留空間,然后在執(zhí)行這行賦值表達式語句時,把值存儲在之前預(yù)留的位置。可以給 number 賦不同的值,這就是 number 之所以被稱為 變量(variable) 的原因。

 

哦!這該死的 C 語言

printf 函數(shù)

在入門例子程序中,有三行 printf(),這是 C 語言的標準函數(shù)。圓括號中的內(nèi)容是從 main 函數(shù)傳遞給 printf 函數(shù)的。參數(shù)分為兩種:實際參數(shù)(actual argument) 和 形式參數(shù)(formal parameters)。我們上面提到的 printf 函數(shù)括號中的內(nèi)容,都是實參。

return 語句

在入門例子程序中,return 語句是最后一條語句。int main(void) 中的 int 表明 main() 函數(shù)應(yīng)返回一個整數(shù)。有返回值的 C 函數(shù)要有 return 語句,沒有返回值的程序也建議大家保留 return 關(guān)鍵字,這是一種好的習(xí)慣或者說統(tǒng)一的編碼風(fēng)格。

分號

在 C 語言中,每一行的結(jié)尾都要用 ; 進行結(jié)束,它表示一個語句的結(jié)束,如果忘記或者會略分號會被編譯器提示錯誤。

關(guān)鍵字

下面是 C 語言中的關(guān)鍵字,C 語言的關(guān)鍵字一共有 32 個,根據(jù)其作用不同進行劃分

數(shù)據(jù)類型關(guān)鍵字

數(shù)據(jù)類型的關(guān)鍵字主要有 12 個,分別是

  • char: 聲明字符型變量或函數(shù)
  • double: 聲明雙精度變量或函數(shù)
  • float: 聲明浮點型變量或函數(shù)
  • int : 聲明整型變量或函數(shù)
  • long: 聲明長整型變量或函數(shù)
  • short : 聲明短整型變量或函數(shù)
  • signed : 聲明有符號類型變量或函數(shù)
  • _Bool: 聲明布爾類型
  • _Complex :聲明復(fù)數(shù)
  • _Imaginary: 聲明虛數(shù)
  • unsigned : 聲明無符號類型變量或函數(shù)
  • void : 聲明函數(shù)無返回值或無參數(shù),聲明無類型指針

控制語句關(guān)鍵字

控制語句循環(huán)的關(guān)鍵字也有 12 個,分別是

循環(huán)語句

  • for : for 循環(huán),使用的最多
  • do :循環(huán)語句的前提條件循環(huán)體
  • while:循環(huán)語句的循環(huán)條件
  • break : 跳出當前循環(huán)
  • continue:結(jié)束當前循環(huán),開始下一輪循環(huán)

條件語句

  • if:條件語句的判斷條件
  • else : 條件語句的否定分支,與 if 連用
  • goto: 無條件跳轉(zhuǎn)語句

開關(guān)語句

  • switch: 用于開關(guān)語句
  • case:開關(guān)語句的另外一種分支
  • default : 開關(guān)語句中的其他分支

返回語句

  • retur :子程序返回語句(可以帶參數(shù),也看不帶參數(shù))

存儲類型關(guān)鍵字

  • auto : 聲明自動變量 一般不使用
  • extern : 聲明變量是在其他文件正聲明(也可以看做是引用變量)
  • register : 聲明寄存器變量
  • static: 聲明靜態(tài)變量

其他關(guān)鍵字

  • const: 聲明只讀變量
  • sizeof : 計算數(shù)據(jù)類型長度
  • typedef: 用以給數(shù)據(jù)類型取別名
  • volatile : 說明變量在程序執(zhí)行中可被隱含地改變

后記

這篇文章我們先介紹了 C 語言的特性,C 語言為什么這么火,C 語言的重要性,之后我們以一道 C 語言的入門程序講起,我們講了 C 語言的基本構(gòu)成要素,C 語言在硬件上是如何運行的,C 語言的編譯過程和執(zhí)行過程等,在這之后我們又加深講解了一下入門例子程序的組成特征。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2012-11-30 11:26:00

代碼注釋

2016-12-09 14:57:47

云計算

2020-07-07 08:51:52

編程語言C語言Java

2010-01-15 17:38:37

C++語言

2019-03-21 14:45:37

C語言開發(fā)應(yīng)用

2019-08-09 09:58:43

PythonJavaGo

2020-04-09 08:29:50

編程語言事件驅(qū)動

2020-05-16 12:20:40

Excel數(shù)據(jù)清洗函數(shù)

2011-07-05 17:07:14

C語言

2011-07-05 16:57:53

C語言

2022-10-12 12:10:42

開發(fā)C語言編程語言

2022-08-31 10:13:04

C語言代碼

2010-01-15 14:46:20

C++語言

2011-01-05 11:12:34

C++

2010-01-22 10:26:40

C++語言

2009-06-15 11:03:10

Java語言C#語言

2010-01-21 16:24:02

C++語言

2011-05-31 13:41:00

C語言

2010-07-07 11:09:36

UDPClient

2010-01-22 15:30:36

C++語言
點贊
收藏

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

极品少妇一区二区三区| 国产精品亚洲一区二区三区在线观看 | 国产自产高清不卡| 欧美大码xxxx| 激情av中文字幕| 一个人看的www视频在线免费观看| 久久综合999| 成人a级免费视频| 免费在线观看黄色av| 欧美重口另类| 777午夜精品视频在线播放| 成人在线免费高清视频| 午夜影院在线视频| 老司机精品视频导航| 国模私拍一区二区三区| av免费播放网站| 草莓视频一区二区三区| 欧洲亚洲国产日韩| 超在线视频97| 久久国产精品无码一级毛片 | 国产欧美精品日韩精品| 精品人妻在线播放| 日韩成人三级| 日韩av一区在线观看| 亚洲免费成人在线视频| 男人天堂视频在线观看| 亚洲女女做受ⅹxx高潮| 免费电影一区| 国产香蕉在线观看| 久久99最新地址| 青青久久av北条麻妃黑人| 深爱五月激情网| 网站一区二区| 欧美日韩1234| 国产成人久久777777| 爱情岛亚洲播放路线| 国产精品乱码人人做人人爱| 欧美一区二区视频97| 日本黄色片免费观看| 国产伦精品一区二区三区视频 | 天天综合天天做天天综合| 在线看无码的免费网站| 日本天堂在线| 成人av网站免费| 97视频资源在线观看| 中文字幕视频二区| 久久久噜噜噜久久狠狠50岁| 国色天香2019中文字幕在线观看| 日日操免费视频| 女优一区二区三区| 日韩高清有码在线| 91黄色免费视频| 9999久久久久| 日韩欧美国产系列| 性色av浪潮av| 免费观看性欧美大片无片| 在线视频一区二区三| 免费高清在线观看免费| 成av人片在线观看www| 亚洲一二三级电影| 欧美精品在欧美一区二区| av亚洲在线| 中文字幕精品—区二区四季| 日韩wuma| 午夜毛片在线| 亚洲欧美一区二区三区久本道91| www.午夜色| 国产淫片在线观看| 国产乱码精品一区二区三区忘忧草 | 擼擼色在线看观看免费| 午夜精品久久久久久不卡8050| 欧美交换配乱吟粗大25p| 在线中文字幕第一页| 亚洲精品视频一区| 又大又硬又爽免费视频| 爱搞国产精品| 在线免费观看不卡av| 日本激情视频在线播放| 亚洲欧洲日韩精品在线| 日韩一区二区三区免费观看| 丰满饥渴老女人hd| 高潮按摩久久久久久av免费| 亚洲国产精品成人av| 无码精品一区二区三区在线播放| 欧洲亚洲成人| 色吧影院999| 欧美精品色哟哟| 99热免费精品在线观看| 日本精品va在线观看| 中文字幕人妻丝袜乱一区三区| 麻豆一区二区三| αv一区二区三区| 日本福利午夜视频在线| 亚洲国产精品99久久久久久久久| 午夜啪啪免费视频| 第一福利在线视频| 欧美性猛片aaaaaaa做受| www.污污视频| 欧美一级全黄| 久久精品视频播放| 久久国产精品影院| 色一区二区三区四区| 欧美黑人性视频| 中文字幕免费高清网站| 国产一区二区成人久久免费影院| 国产有色视频色综合| 成人性爱视频在线观看| 一区二区三区**美女毛片| 日韩精品一区二区三区色欲av| 日本成人一区二区| 亚洲黄色有码视频| 91香蕉视频污在线观看| aa级大片欧美三级| 亚洲一区二区三区四区视频| 欧美日韩国产综合视频| 亚洲精选免费视频| 日日碰狠狠丁香久燥| 日本伊人久久| 伊人久久大香线蕉av一区二区| 欧美成人三级视频| 日本亚洲一区二区| 国产一区自拍视频| 中文字幕中文字幕在线十八区| 色婷婷激情久久| 中文字幕天堂av| 一区二区不卡| 国产精品嫩草影院一区二区| 天天干,天天操,天天射| 有坂深雪av一区二区精品| 人人爽人人av| 你懂的视频欧美| 69av成年福利视频| 高h放荡受浪受bl| 亚洲色欲色欲www| 性欧美videossex精品| 亚洲精品进入| 97国产在线观看| 亚洲黄色a级片| 本田岬高潮一区二区三区| 亚洲午夜精品一区二区| 电影一区二区三区| 日韩精品极品在线观看播放免费视频| caoporn91| 精品一区二区三区视频| 天堂资源在线亚洲资源| 在线成人av观看| 日韩电影中文字幕一区| 五月天婷婷丁香| 成人性视频免费网站| 激情视频小说图片| а天堂中文最新一区二区三区| 中文国产成人精品| 怡红院男人天堂| 欧美激情综合网| 欧美大尺度做爰床戏| japanese国产精品| 国产精品久久久久久久久久99| 麻豆国产在线播放| 91激情在线视频| 欧美人妻一区二区三区| 日产国产高清一区二区三区| 午夜精品短视频| 亚洲欧洲日韩精品在线| 久久这里只有精品视频首页| 国产麻豆91视频| 一区二区视频在线| 久久久久久久人妻无码中文字幕爆| 欧美午夜一区二区福利视频| 国产高清自拍一区| 精品丝袜在线| 国产一区二区三区在线观看网站| www.色国产| 国产精品视频你懂的| 欧美日韩一区二区三区69堂| 999精品视频| 99久久99久久精品国产片| 8x8ⅹ拨牐拨牐拨牐在线观看| 亚洲国产精品久久精品怡红院| 日本一二三区不卡| 久久奇米777| 99视频在线视频| 亚洲在线久久| 国产经典一区二区三区| 午夜影院一区| 在线国产精品视频| aa视频在线免费观看| 午夜精品久久久久久久| 欧美性受xxxx黑人| 国产成人在线免费观看| 777久久久精品一区二区三区| 成人在线免费观看网站| 51午夜精品| 深夜av在线| 日韩中文字幕视频在线| 黑人精品一区二区| 91久久一区二区| 激情四射综合网| 久久精品人人爽人人爽| 国产毛片久久久久久| 亚洲激情成人| 一区二区精品在线| 免费日韩一区二区三区| 国产精品日日做人人爱| 国产网红女主播精品视频| 亚洲一级一级97网| 国产黄色av网站| 91成人看片片| 国产一级在线播放| 国产精品蜜臀在线观看| 色哟哟视频在线| 久久er99热精品一区二区| 波多野结衣家庭教师在线| 国产精品97| 欧美不卡三区| 亚洲精品不卡在线观看| 国产精品国产福利国产秒拍| 特级毛片在线| 色yeye香蕉凹凸一区二区av| 日韩欧美在线番号| 日韩欧美一级在线播放| 亚洲av综合一区| 黑人精品xxx一区| 久久亚洲成人av| 日韩一区中文字幕| 天天干天天舔天天操| 99久久精品国产导航| 午夜影院免费观看视频| 老牛国产精品一区的观看方式| 一卡二卡三卡视频| 亚洲视频电影在线| 亚洲成人自拍视频| 久久av资源| 精品在线视频一区二区三区| 日韩08精品| 91在线观看免费观看| 国产精品久久久久久久久免费高清| 欧洲日韩成人av| 国产高清在线a视频大全| 久久精品一区中文字幕| av片在线看| 亚洲性猛交xxxxwww| 欧美扣逼视频| 日韩精品免费视频| 少妇av一区二区| 精品福利一区二区三区免费视频| 国产孕妇孕交大片孕| 欧美综合视频在线观看| 日本久久综合网| 色综合一区二区三区| 欧美特黄aaaaaa| 欧美日韩一区二区免费在线观看| 国产 欧美 日韩 在线| 天天综合色天天综合色h| 日本天堂网在线观看| 午夜精品免费在线| 日韩特黄一级片| 天天做天天摸天天爽国产一区| 日韩av男人天堂| 精品国产31久久久久久| 色婷婷av国产精品| 欧美色视频日本版| 亚洲图片在线视频| 在线观看一区不卡| 在线视频 91| 欧美日韩国产一级| 国产女人18毛片水18精| 欧美一级欧美三级在线观看| 午夜精品久久久久久久91蜜桃| 精品国产乱码久久| 性xxxx视频播放免费| 亚洲美女喷白浆| www.亚洲资源| 久久成人国产精品| xxx.xxx欧美| 日韩av片免费在线观看| yy6080久久伦理一区二区| 成人做爰www免费看视频网站| 欧美中文高清| 精品乱码一区二区三区| 精品一区亚洲| 特色特色大片在线| 尤物网精品视频| 国产精品69页| 国精产品一区一区三区mba视频 | 成人福利视频在线| 国产精品亚洲无码| 亚洲天堂中文字幕| 五月天婷婷丁香| 欧美亚洲动漫制服丝袜| 国产手机精品视频| 日韩黄色高清视频| 色的视频在线免费看| 久久久久久久一区二区三区| 欧美成人资源| 91美女片黄在线观| 老司机精品在线| 亚洲一区三区在线观看| 韩日欧美一区| 91看片在线免费观看| 国产乱码精品一品二品| 亚洲天堂久久新| 亚洲免费观看高清完整| 成人午夜视频在线播放| 91精品国产色综合久久ai换脸| 婷婷色在线视频| 久久精品国产一区二区电影| 国产精品13p| 成人性生交大片免费看小说| 日本亚洲不卡| 懂色av一区二区三区四区五区| 国产麻豆综合| 人妻换人妻仑乱| 久久久国产一区二区三区四区小说| 麻豆视频在线免费看| 欧美日韩中文字幕| www.色播.com| 色综久久综合桃花网| 99爱在线观看| 亚洲在线观看视频| jizzjizz欧美69巨大| 日韩国产欧美亚洲| 国产在线播放一区二区三区| 蜜桃传媒一区二区亚洲| 午夜精品在线看| 99热这里只有精品99| 在线观看欧美视频| 妞干网免费在线视频| 成人av免费在线看| 久久中文字幕二区| 可以免费在线看黄的网站| 成人aaaa免费全部观看| 杨钰莹一级淫片aaaaaa播放| 欧美在线一二三| 亚洲日本香蕉视频| 欧美极品在线播放| 国产日韩欧美中文在线| 图片区小说区区亚洲五月| 国产精品一国产精品k频道56| 在线xxxxx| 一区二区三区四区蜜桃| 国产精品国产av| 中文字幕综合一区| 欧美aaa视频| 日韩av电影免费在线| 欧美在线综合| 人妻少妇精品视频一区二区三区| 亚洲第一福利视频在线| 亚洲精品18p| 欧美国产日韩免费| 婷婷综合国产| 97免费视频观看| 成人爽a毛片一区二区免费| 杨钰莹一级淫片aaaaaa播放| 91精品免费观看| fc2ppv国产精品久久| 亚洲xxxx3d| 欧美日韩三级电影在线| 伊人色在线观看| 亚洲视频每日更新| 亚洲爱爱综合网| 欧美精品video| 加勒比色老久久爱综合网| aa在线观看视频| 久久精品综合网| 瑟瑟视频在线免费观看| 中文字幕在线看视频国产欧美| 国内自拍亚洲| 日本美女爱爱视频| 福利电影一区二区三区| 日本免费一二三区| 日韩va亚洲va欧洲va国产| 亚洲深夜视频| 亚洲春色在线视频| 精品制服美女丁香| 91杏吧porn蝌蚪| 日韩av一区在线观看| 欧洲亚洲两性| 亚洲精品自在在线观看| 国产精品一区二区黑丝| 久久精品人妻一区二区三区| 亚洲精品小视频在线观看| 欧美xnxx| 久久在线中文字幕| 久久综合狠狠综合| 国产又粗又大又爽视频| 久久久久久久久久久亚洲| 日韩精品福利一区二区三区| 一区二区xxx| 亚洲动漫第一页| 岛国在线大片| 成人av资源网| 石原莉奈在线亚洲二区| 国产精品免费人成网站酒店| 精品国产免费一区二区三区四区| 爱情电影社保片一区| 一区二区精品视频| 99久久精品国产导航| 国产又粗又猛又爽又黄91| 国内精品一区二区三区四区| 欧美在线免费看视频|