C語言入門

Download c eBook

備註

C是一種通用的命令式計算機編程語言,支持結構化編程,詞法變量範圍和遞歸,而靜態類型系統可防止許多意外操作。通過設計,C提供了有效映射到典型機器指令的結構,因此它已經在以前用彙編語言編寫的應用程序(包括操作系統)以及從超級計算機到嵌入式系統的各種計算機應用軟件中得到了長期使用。 。

儘管該語言具有低級功能,但該語言旨在鼓勵跨平台編程。可以為各種各樣的計算機平台和操作系統編譯符合標準且可移植編寫的C程序,其源代碼幾乎沒有變化。從嵌入式微控制器到超級計算機,這種語言已經廣泛應用於各種平台。

C最初由Dennis Ritchie於1969年至1973年間在貝爾實驗室開發,用於重新實現Unix操作系統。它已成為有史以來使用最廣泛的編程語言之一,來自不同供應商的C編譯器可用於大多數現有的計算機體系結構和操作系統。

通用編譯器

編譯C程序的過程在編譯器和操作系統之間有所不同。大多數操作系統都沒有編譯器,因此您必須安裝一個。一些常見的編譯器選擇是:

以下文檔應該為您提供有關如何開始使用一些最常見的編譯器的良好概述:

編譯器C版支持

請注意,編譯器對標準C具有不同級別的支持,許多仍然不完全支持C99。例如,自2015年發布以來,MSVC支持C99的大部分,但仍然有一些重要的例外支持語言本身(例如預處理似乎不符合)和C庫(例如<tgmath.h> ),也沒有他們是否必須記錄他們的“依賴於實現的選擇”。 維基百科有一個表格,顯示一些流行編譯器提供的支持。

一些編譯器(特別是GCC)提供或繼續提供編譯器擴展 ,這些擴展實現了編譯器生產者認為必要,有用或相信可能成為未來C版本的一部分的附加功能,但目前不是任何C標準的一部分。由於這些擴展是特定於編譯器的,因此可以認為它們不是交叉兼容的,並且編譯器開發人員可以在以後的編譯器版本中刪除或更改它通常可以通過編譯器標誌來控制這種擴展的使用。

此外,許多開發人員的編譯器僅支持他們所針對的環境或平台強加的特定C版本。

如果選擇編譯器,建議選擇對目標環境允許的最新C版本具有最佳支持的編譯器。

代碼風格(這裡是偏離主題):

因為C中的空格是無關緊要的(也就是說,它不會影響代碼的操作),程序員經常使用空格來使代碼更容易閱讀和理解,這稱為代碼風格 。它是編寫源代碼時使用的一組規則和準則。它涵蓋的問題包括如何縮進行,是否應使用空格或製表符,如何放置大括號,如何在操作符和括號周圍使用空格,如何命名變量等等。

代碼風格不在標準範圍內,主要是基於意見(不同的人發現不同的風格更容易閱讀),因此,它通常被認為是關於SO的偏離主題。在一個人自己的代碼中,關於樣式的最重要的建議是,一致性是最重要的 - 選擇或製作一種風格並堅持下去。只需解釋一下,通常使用的各種命名樣式通常由程序員選擇,而不是創建自己的樣式。

一些常見的縮進樣式有:K&R風格,Allman風格,GNU風格等。其中一些樣式有不同的變體。例如,Allman被用作常規的Allman或流行的變體Allman-8。有關一些流行風格的信息可以在維基百科上找到。這些樣式名稱取自作者或組織經常發布的標準,供許多參與其代碼的人使用,這樣每個人都可以在知道樣式時輕鬆閱讀代碼,例如構成部分代碼的GNU格式指南GNU編碼標准文檔。

一些常見的命名約定是:UpperCamelCase,lowerCamelCase,lower_case_with_underscore,ALL_CAPS等。這些樣式以各種方式組合以用於不同的對象和類型(例如,宏通常使用ALL_CAPS樣式)

通常建議在SO文檔中使用K&R樣式,而不鼓勵使用更為深奧的樣式,例如Pico。

C標準未涵蓋的庫和API(因此在這裡偏離主題):

版本

標準發布日期
K&R N / A 1978年2月22日
C89 ANSI X3.159-1989 1989年12月14日
C90 ISO / IEC 9899:1990 1990年12月20日
C95 ISO / IEC 9899 / AMD1:1995 1995年3月30日
C99 ISO / IEC 9899:1999 1999-12-16
C11 ISO / IEC 9899:2011 2011-12-15

你好,世界

要創建一個在屏幕上打印“Hello,World”的簡單C程序,請使用文本編輯器創建一個新文件(例如hello.c - 文件擴展名必須為.c ),其中包含以下源代碼:

你好ç

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

Coliru現場演示

讓我們逐行看看這個簡單的程序

int main(void)
 

該行告訴編譯器在程序中包含標準庫頭文件stdio.h 的內容。標頭通常是包含函數聲明,宏和數據類型的文件,您必須在使用之前包含頭文件。這一行包括stdio.h 因此它可以調用函數puts()

詳細了解標題。

{
    …
}
 

該行開始定義函數。它聲明了函數的名稱( main ),它所期望的參數的類型和數量( void ,表示無),以及此函數返回的值的類型( int )。程序執行從main() 函數開始。

    puts("Hello, World");
 

花括號成對使用以指示代碼塊的開始和結束位置。它們可以在很多方面使用,但在這種情況下,它們指示函數的開始和結束位置。

    return 0;
 

此行調用puts() 函數將文本輸出到標準輸出(默認情況下為屏幕),然後是換行符。要輸出的字符串包含在括號內。

"Hello, World" 是將寫入屏幕的字符串。在C中,每個字符串文字值必須在雙引號"…"

詳細了解字符串。

在C程序中,每個語句都需要用分號(即; )終止。

gcc hello.c -o hello
 

當我們定義main() ,我們將它聲明為返回int 的函數,這意味著它需要返回一個整數。在此示例中,我們返回整數值0,用於指示程序已成功退出。 return 0; 聲明,執行過程將終止。

編輯程序

簡單的文本編輯器包括Linux上的vim gedit ,或Windows上的Notepad 。跨平台編輯器還包括Visual Studio Code Sublime Text

編輯器必須創建純文本文件,而不是RTF或其他任何格式。

編譯並運行該程序

要運行該程序,首先需要將此源文件( hello.c )編譯為可執行文件(例如,在Unix / Linux系統上為hello 或在Windows上為hello.exe )。這是使用C語言的編譯器完成的。

查看有關編譯的更多信息

使用GCC編譯

GCC (GNU Compiler Collection)是一種廣泛使用的C編譯器。要使用它,請打開終端,使用命令行導航到源文件的位置,然後運行:

gcc -Wall -Wextra -Werror -o hello hello.c
 

如果在源代碼( hello.c )中沒有發現錯誤,編譯器將創建一個二進製文件 ,其名稱由-o 命令行選項( hello )的參數給出。這是最終的可執行文件。

我們還可以使用警告選項-Wall -Wextra -Werror 來幫助識別可能導致程序失敗或產生意外結果的問題。它們不是這個簡單程序所必需的,但這是添加它們的方法:

clang -Wall -Wextra -Werror -o hello hello.c
 

使用clang編譯器

要使用clang 編譯程序,您可以使用:

cl hello.c
 

根據設計, clang 命令行選項與GCC類似。

從命令行使用Microsoft C編譯器

如果在支持Visual Studio的Windows系統上使用Microsoft cl.exe 編譯器並且設置了所有環境變量,則可以使用以下命令編譯此C示例,該命令將在執行命令的目錄中生成可執行文件hello.exe (有一些警告選項,例如cl /W3 ,大致類似於GCC或clang的-Wall 等)。

#include <stdio.h>
 

執行程序

編譯完成後,可以通過在終端中輸入./hello 來執行二進製文件。執行時,編譯的程序將打印Hello, World ,然後是換行符,打印到命令提示符。

原創“Hello,World!”在K&R C.

以下是原版“Hello,World!” Brian Kernighan和Dennis Ritchie 編寫的The C Programming Language一書(Ritchie是貝爾實驗室C編程語言的原始開發人員),被稱為“K&R”:

K&R
#include <stdio.h>

main()
{
    printf("hello, world\n");
}
 

請注意,在編寫本書第一版(1978)時,C編程語言並未標準化,並且該程序可能無法在大多數現代編譯器上編譯,除非他們被指示接受C90代碼。

K&R書中的第一個例子現在被認為質量很差,部分原因是它缺少main() 的顯式返回類型,部分原因是它缺少return 語句。本書的第2版是為舊C89標準編寫的。在C89中, main 的類型默認為int ,但K&R示例不會向環境返回定義的值。在C99及更高版本的標準中,返回類型是必需的,但是可以安全地省略main (並且只有main )的return 語句,因為C99 5.1.2.2.3引入了特殊情況 - 它相當於返回0 ,這表明成功。

當程序不使用任何命令行參數時,託管系統的推薦和最可移植的main 形式是int main (void) ,或者當程序使用命令行參數時, int main(int argc, char **argv)


C90§5.1.2.2.3 程序終止

從初始調用到main 函數的返回等效於使用main 函數返回的值作為其參數調用exit 函數。如果main 函數執行不指定值的返回,則返回到主機環境的終止狀態是未定義的。

C90§6.6.6.4 return 聲明

如果執行了沒有表達式的return 語句,並且調用者使用了函數調用的值,則行為是未定義的。到達終止函數的} 等同於執行不帶錶達式的return 語句。

C99§5.1.2.2.3 程序終止

如果main 函數的返回類型是與int 兼容的類型,則從初始調用返回main 函數等效於調用exit 函數,並將main 函數返回的值作為其參數;到達終止main 函數的} 返回值0.如果返回類型與int 不兼容,則返回到主機環境的終止狀態未指定。

Stats

4443 Contributors: 67
Thursday, July 27, 2017
許可下: CC-BY-SA

不隸屬於 Stack Overflow
Rip Tutorial: info@zzzprojects.com

下載電子書