成人app

首頁  /  C語言教程  /  實例說明  /  

實例說明

點擊打開在線編譯器,邊學邊練

上一節,我們大致總攬了一個簡單C程序的框架,程序如下:


#include<stdio.h>                 /*引入頭文件*/
int main(void)                  /*一個簡單的C程序*/
{
    int number;             /*定義個名字叫做number的變量*/
    number=2014;                /*給number賦一個值*/
    printf("Hello ! I am dotcpp.com\n");    /*像屏幕打印一句話*/
    printf("This year is %d\n",number);
    return 0;
}


程序細節


或許您已經看懂了前面的敘述,但又覺得不能夠通透。誠然如此,麻雀雖小,五臟俱全,即使非常簡單的一個C程序,也包含著許多的知識,這一節,我們將從逐條語句出發,去深入探討程序的背后,如果您能更深的理解這個簡單的程序,那么在之后的學習中將更加順暢自如! 

一、頭文件 

#include<stdio.h>

成人app   

這個是程序的第一行,作用為在我們的代碼中該行所在的位置引入stdio.h這個文件的全部內容,更簡單的說,就像一個粘貼的操作,而此刻大家應該想到,#include后尖括號<>里的文件也可以是其他頭文件,沒錯,在今后的學習中,我們會看到更多的#include語句, 其中包含了更多的頭文件,這也體現了一種設計思想。可以方便的在多個程序間共享公用的信息。 
#include語句是C預處理器指令(preprocessor directive)的一個例子,這些是編譯器在編譯代碼之前要做的準備工作,稱之為預處理(preprocessing) 
再來說說stdio.h這個文件,不用覺得奇怪,它和我們平常見到的 123.txt 并無差別,只是后綴名不同而已,這個名字表示:標準輸入輸出頭文件,正如英文:standard input/output header,它包含了與輸入輸出相關的函數(比如printf)的信息,在C語言的世界中,人們稱出現在文件頂部的信息集合為頭(header),C實現通常都帶有多個頭文件。 
那么,為什么C語言沒有內置的輸入輸出語句呢? 一個答案是并非所有的程序都要用到I/O(輸入/輸出)包,并且C語言的一個基本的設計原則就是避免不必要的成分。這個經濟的使用資源的原則使得C語言在嵌入式編程中非常的流行,例如,為一個控制自動報警系統的芯片編寫程序。值得一提的是,#include甚至不是C語言的語句!開頭的#,這個符號表明這一行是在編譯器接手之前先由C預處理器處理的語句。以后我們將碰到更多的預處理指令。 


二、主函數 


int main()

成人app    

接下來的代碼聲明了一個main函數。的確,main是一個及其普通的名字,但它是唯一的選擇。一個C程序(我們不考慮例外的情況)總是從main()函數開始執行。我們可以對自己使用的其他函數任意命名,但是main()必須是開始的函數。每個C程序中必須有它! 
那么圓括號的功能呢?它表明main()是一個函數。以后,我們將遇到更多的函數。現在,請記住這個函數就是C程序的基本模塊。 
int指明main()函數的返回類型。這意味著main()函數返回值的基本類型為整數。返回到哪里呢?返回給操作系統。為什么要有返回值呢?打個比方,就像皇上交代大臣去辦事,大臣完成后總要復命,向皇上稟告,告訴皇上是成功還是失敗。 
函數名后面的圓括號一般包含傳遞給函數的信息。在我們這個簡單的例子中沒有傳遞任何信息,因此圓括號內包含了單詞void。以后我們將看到更多傳遞參數的例子。 
另外,您可能在一些教材或老的版本中,看到過這樣的寫法: 
main() 
這種形式在C90標準中勉強允許這種形式,在C99標準不允許。即使您的編譯器允許。 
以及還有這樣的寫法: 
void main() 
僅僅有些編譯器允許這種形式,但還沒有任何編譯器考慮接受它,而有的編譯器則會報錯。因此,我們建議您不要這樣做。另一方面,堅持使用標準形式,我們也不必擔心程序從一個編譯環境移到另一個編譯環境上時出錯的問題。


三、注釋 


/*一個簡單的C程序*/


包含在/* */之間的部分是程序注釋。使用注釋的目的是使人們(包括我們自己)更容易的理解我們的程序。比如,有些程序員除了用注釋說明我們的代碼以外,還會在代碼的注釋中寫這一天的天氣如何、心情如何等等。C語言的注釋的一個好處就是可以放在任何地方,甚至是和它要解釋的語句在同一行。一個較長的注釋可以單放一行,或者是多行。在/*和*/之間的所有內容都會被編譯器忽略掉。 
如:

int number ;/* 定義一個整形變量number*/

成人app   


注釋也可以分成兩行或多行


/*
     
  筆者自述:
    時間:18:24
    地點:北半球
    天氣:窗外天氣不明 微冷
  肚子有點餓
*/

成人app    

除此之外,C99還增加另一種風格的注釋,它被普遍用在C++或java里,這種新形式使用//符號,但這種注釋被限制在一行里: 

x=10;//將x賦值為10


四、花括號 


{
/*... */
}

    

在C程序中,通常所有的C函數都使用花括號來表示函數體的開始與結束。它們的存在是必不可少的,因此我們不能丟掉它們。并且僅有花括號{}能起到這種作用,小括號()和中括號[]都不行。 
花括號還可以用來把函數中的語句聚集到一個單元或代碼塊中。 

五、聲明 


int num;

成人app   


程序中這一行叫做聲明語句(declaration statement)。該聲明語句是C語言中最重要的功能之一。這個特殊的例子聲明兩件事情。第一,在函數中您有一個名為num的變量,第二,int說明num是一個整數,也就是說這個數沒有小數部分(int是C語言的一種數據類型)。編譯器使用這個信息為變量num在內存中分配一個合適的存儲空間。句末的分號指明這一行是C語言的一個語句或指令,分號是語句的一部分,每個C語言都以一個分號結束。 
單詞int是C語言的一個關鍵字,代表了一種C語言的數據類型。關鍵字是用來表達語言的單詞,您不能將他們用于其他目的。比如,不能用int用作一個函數名或者一個變量的名字。 
本例中的單詞num是一個標識符(identifier),也就是您為一個變量、函數或其他實體所選的名字。這樣該聲明就把一個特殊的標識符和計算機中的一個特殊位置聯系了起來,同時也確定了該位置存儲的信息類型(即數據類型),我們為這個變量賦值,也就相當于在計算機中這個特殊的位置(今后我們將清楚,這個位置即所謂的地址)賦值。因為,C語言是人和計算機溝通的紐帶。 
在C語言中,所有變量都必須在使用之前定義。這就意味著您必須提供程序中要用到的所有變量名的列表,并且指出每個變量的數據類型。聲明變量被認為是一種好的編程技術,在C語言當中必須這樣做。 
傳統上,C語言要求必須在一個代碼塊的開始處聲明變量,在這之前不允許任何其他語句。也就是說,main()函數如下所示: 


int main()//traditional rules  (傳統的用法)
{
    int year;
    int month;
    int day;
    year = 2014;
    month = 2;
    day = 28;
    //other statements (其他的語句)
}

 

現在 C99遵循 C++的慣例,允許把聲明放在代碼塊中的任何位置。然而,在首次使用變量之前仍然必須先聲明它。因此,如果你的編譯器支持這種功能,你的代碼就可以像下面這樣: 

   

int main()  // C99 rules (C99 用法)
  {
    // some statements  (一些語句)
    int doors;
    doors = 5;   // first use of doors (第一次使用到的變量)
    // more statements  (更多的語句)
    int dogs;
    dogs = 3;    // first use of dogs  (第一次使用到的變量)
    // other statements (其他的語句)
  }

成人app    

現在你可能還有三個問題。首先,數據類型是什么?第二,可以選擇什么樣的名字?第三,為什么必須對變量進行聲明? 下面來看這些問題的答案。 

1.數據類型 
C語言可以處理多個數據種類(或類型),例如整數,字符和浮點數。把一個變量聲明為整數類型或字符類型是計算機正確地存儲,獲取和解釋該數據的基本前提。在后面您將學到各種各樣的可用類型。 

2.名字的選擇 
您應該盡量使用有意義的變量名(例如,如果你的程序需要蘋果這個變量,那么使用apple)。如果名字不能表達清楚,可以用注釋解釋變量所代表的意思。通過這種方式使程序更易讀是良好編程的基本技巧之一。 
能夠使用的字符的數量與 C語言的不同實現有關。C99標準允許一個標識符最多可以有 63個字符,除了外部標識符,后者只識別31個字符。與C90分別要求的31個字符和6個字符相比較,這是一個相當可觀的進步,而更舊的編譯器通常最多只允許8個字符。實際上,你使用的字符數量可以超過規定的最大值,但是編譯器不會識別額外的字符。因此,如果一個系統最大字符數為8,那么clangdot和clangdotcc將被看作是一個名字,因為它們的前8個字符相同。 
可供使用的字符有小寫字母,大寫字母,數字和下劃線。第一個字符必須是字母或者下劃線。 
C語言的名字是區分大小寫的,即把一個大寫字母和與之對應的小寫字母看作是不同的。因此,clang不同于Clang或者CLANG。 

六. 賦值 


num = 1; // =  (賦值運算符)

成人app    

這行程序是一個賦值語句(assignment statement)。賦值語句是 C語言的基本操作之一。這個特殊的例子的意思是“把值1賦給變量 num”。前面的 int num;語句在計算機內存中為變量 num 分配了空間,該賦值語句在那個地方為變量存儲了一個值。如果你想的話,以后你還可以給 num 賦另一個值,這就是把 num 稱為變量的原因。可以把變量理解成是一個容器,用來盛放常量的。另外注意賦值語句賦值的順序是從右到左。同樣,該語句也用分號結束。 

成人app七. printf()函數 

   

printf ("Hello!");
printf ("I am dotcpp.com\n");
printf ("My birthday is %d\n", num);

    

所有這些行都使用了 C語言的一個標準函數:printf()。圓括號表明 printf 是一個函數名。圓括號中包含的內容是從函數 main()傳遞到函數 printf()的信息。例如,第一行把 Hello! 傳遞給 printf()函數。 這樣的信息被稱為參數(argument),更完整的名稱是函數的實際參數(actual argument)。printf()函數如何處理這個參數?程序將識別兩個雙引號之間的內容并把它們顯示在屏幕上。 
第一行 printf()語句是如何在 C語言中調用(call)或請求(invoke)一個函數的例子。只須鍵入函數的名字,把所需的一個或多個參數放進圓括號中。當程序運行到這一行時,控制權將轉給該函數(在這個例子中是 printf())。當函數完成了它所要做的工作,將控制權返回給原來的函數(調用函數),在這個例子中是 main()。 
那么下一個 printf()行呢?引號中有字符\n,但并沒有輸出它們!發生了什么事情呢? \n字符的意思是開始新的一行。 \n 組合(依次鍵入這兩個字符)代表一個稱為換行符(newline character)的字符,它意味著“在下一行的最左邊開始新的一行”。換句話說,打印換行字符的效果和在普通鍵盤上按下回車鍵一樣。當鍵入 printf()這個參數時,為什么不直接按回車鍵呢?因為那將看作是直接針對編輯器的命令,而不是作為存在源代碼中的指令。也就是說,當你按回車鍵時,編輯器退出你正在輸入的當前行,并開始新的一行。而換行符則影響程序的輸出如何顯示。 
換行符是轉義字符(Escape Sequence)的一個例子。轉義字符通常用于代表難于表達的或是無法鍵入的字符。其他的例子比如 \t 代表 Tab鍵, \b 代表退格鍵盤。每個轉義字符都用斜線字符(\)開始。 
這樣就解釋了三個 printf()語句只產生兩行輸出的原因:第一個 printf指令中沒有換行字符,而第二個和第三個都有。 
成人app最后一個 printf()行中又有一個奇怪的問題:當輸出這一行時 %d 起什么作用?回憶一下,這一行的輸出結果是: 


My birthday is 2014

成人app    

喔!當這一行輸出時,數字2014被符號組合%d代替了,而1是變量 num的值。%d是一個占位符,其作用是指出輸出 num 值的位置。 
事實上,%告訴程序把一個變量在這個位置輸出,d告訴程序將輸出一個十進制(以10為基數)整數變量。printf()函數允許多種輸出變量格式,包括十六進制(以16為基數)整數和帶小數點的數。實際上,printf()中的 f 暗示著這是一種格式化(format)的輸出函數。每一種數據都有自己的說明符,往后會有更多的說明。 

八. Return 語句 


return 0;

    

return 語句(返回語句)是程序的最后一個語句。在 int main(void)中 int 表示 main()函數的返回值應該是一個整數。C標準要求 main()這樣做。帶有返回值的 C語言函數要使用一個 return 語句,該語句包括關鍵字 return,后面緊跟著要返回的值,然后是一個分號。對于 main()函數來說,如果你漏掉了 return語句,則大多數編譯器將對你的疏忽提出警告,但仍將編譯該程序。此時,你可以暫時把 main()中的 return語句看作是保持邏輯連貫性所需的內容。但對于某些操作系統(包括 DOS 和 UNIX )而言,它有實際的用途。



本文固定URL:http://hnsaiyang.com/course/6

第一章 C語言的過去與未來
第二章 C語言快速入門
第三章 C語言的數據類型
第四章 C語言中的基本輸入輸出
第五章 運算符和表達式
第六章 C語句和程序流
第七章 函數
第八章 數組
第九章 指針
第十章 復合結構
第十一章 文件操作
第十二章 預處理
Dotcpp在線編譯      (登錄可減少運行等待時間)