C_Primer第2章 C語言概述
本章介紹以下內容:
- 運算子
- 函式:main()、printf()
- 編寫一個簡單的C程式
- 建立整形變數,為其賦值並在螢幕上顯示其值
- 換行字元
- 如何在程式中寫註釋,建立包含多個函式的程式,發現程式的錯誤
- 什麼是關鍵字
2.1 簡單的C程式示例
#include<stdio.h> int main() { int num; num = 10; printf("I am a simple "); printf("computer.\n"); printf("MY favorite number is %d because it is first.\n",num); return 0; }
程式輸出:
I am a simple computer.
MY favorite number is 10 because it is first.
2.2 示例解釋
2.2.1 第1遍:快速要要
2.2.2 第2遍:程式細節
1. #include指令和標頭檔案
2.main()函式
函式是C程式的基本模組
如果瀏覽舊式的C程式碼,會發現程式以如下形式開始:
main()
C90標準勉強接受這種形式,但C99和C11標準不允許這樣寫。因此,即你你使用的編譯器允許,也不要這樣寫。
你還會看到下面這種形式
void main()
一些編譯器允許這樣寫,但是所有的標準都未認可這種寫法。因此,編譯器不必接受這種形式,而且許多編譯器都不能這樣寫。需要強調的是,只要堅持使用標準形式,把程式從一個編譯器移至另一個編譯器時就不會出什麼問題。
3.註釋
4.花括號、函式體和塊
5.宣告
int num;
程式清單2-1中,這行程式碼叫作宣告(declaration)。宣告是C語言最重要的特性之一。
變數
資料型別
關鍵字
以前的C語言,還要求把變數宣告在塊的頂部,其他語句不能在任何宣告的前面。也就是說,main()函式體如下所示:
int mian() //舊規則
{
int doors;
int dogs;
doors = 5;
dogs = 3;
// 其他語句
}
C99和C11遵循C++的慣例,可以把宣告放在塊中的任何位置。儘管如此,首次使用變數之前一定要先宣告它。加些,如果編譯器支援這一新特性,可以這樣編寫上面的程式碼。
int main() //目前的C規則
{
//一些語句
int doors;
doors = 5; //第1次使用doors
//其他語句
int dogs;
dogs = 3; //第1次使用dogs
//其他語句
}
為了與舊系統更好地相容,本書沿用最初的規則(即,把變數宣告都寫在塊的頂部 )。
資料型別
命名
C99和C11允許使用更長的識別符號名,但是編譯器只識別前63個字元。
宣告變數的4個理由
6.賦值
7.printf()函式
8.return語句
2.3簡單程式的結構
2.4.提高程式可讀性技巧
2.5進一步使用C
程式清單2.2 fathm_ft.c程式
//fathm_ft.c --把2英尋轉換成英寸,1英尋等於6英尺
#include<stdio.h>
int main(void)
{
int feet,fathoms;
fathoms = 2;
feet = 6 * fathoms;
printf("There are %d feet in %d fathoms!\n",feet,fathoms);
printf("Yes,I said %d feet!\n",6 * fathoms);
return 0;
}
2.5.1 程式說明
2.5.2 多條宣告
2.3.3 乘法
2.5.4 列印多個值
2.6 多個函式
程式清單2-3 two_func.c程式
//*two_func.c --一個檔案中包含兩個函式 */
#include <stdio.h>
void butler(void); /* ANSI/ISO C函式原型*/
int main(void)
{
printf("I will summon the butler function.\n");
butler();
printf("Yes,Bring me some tea and writeable DVDs.\n");
}
void butler(void)
{
printf("You rang,sir?\n");
}
該程式輸出如下:
I will summon the butler function.
You rang,sir?
Yes,Bring me some tea and writeable DVDs.
butler()函式在程式中出現了3次。第1次是函式原型(prototype),告知編譯器在程式中要使用該函式;第2次以函式呼叫(function call) 的形式出現在main()中;最後一次現現在函式定義(function definition)中,函式定義即是函式本身的原始碼。下面逐一分析。
C90標準新增了函式原型,舊式的編譯器可能無法識別(稍後我們將介紹,如果使用這種編譯器應該怎麼做)。函式原型是一種宣告形式,告知編譯器正在使用某函式,因此函式原型也被稱為函式宣告(function declaration)。函式原型還指明瞭函式的屬性。例如,butler()函式原型中的第1個void表明,butler()函式沒有返回值(通常,被調函式會向主調函式返回一個值,但是bulter()函式沒有)。第2個void(butler(void)中的void)的意思是butler()函式不帶引數。因此,當編譯器執行至此,會檢查butler()是否使用得當。注意,void在這裡的意思是“空的”,而不是‘“無效”。
早期的C語言支援一種更簡單的函式宣告,只需要指定返回型別,不用描述引數"
void butler();
早期的C程式碼中的函式宣告就類似上面這樣,不是現在的函式原型。C90、C99和C11標準都承認舊版本的形式,但是也表明了會逐漸淘汰這種過時的寫法。如果要使用以前寫的C程式碼,就需要把舊式宣告轉換成函式原型。本書在後面的章節會繼續介紹函式原型的相關內容。
C標準建議,要為程式中用到的所有函式提供函式原型。
2.7除錯程式
程式清單2.4 nogood.c程式
/*nogood.c --有錯誤的程式*/
#include <stdio.h>
int main(void)
(
int n,int n2,int n3;
/*該程式有多處錯誤
n= 5;
n2 = n * n;
n3 = n2 * n2;
printf("n = %d, n squared = %d, n cubed = %d\n",n,n2,n3);
return 0;
)
2.7.1語法錯誤
2.7.2語言錯誤
2.7.3程式狀態
2.8 關鍵字和保留識別符號
2.9 關鍵概念
程式設計是一件富有挑戰性的事情。程式設計師要具備抽象和邏輯的思維,並謹慎地處理細節問題(編譯器會強迫你注意細節問題)。平時和朋友交流時,可能用鍩幾個單詞,犯一兩個語法錯誤,或者說幾句不完整的句子,但是對方能明白你想說什麼。而編譯器不允許這樣,對它而言,幾乎正確仍然是錯誤。
編譯器不會在下面講到的概念性問題上幫助你。因此,本書在這一章中介紹一些關鍵概念幫助讀者彌補這部分的內容。
在本章中,讀者的目標應該是理解什麼是C程式。
2.10 本章小結