第二章 C語言概述
1. 簡單的C程式示例
cat first.c
#include <stdio.h>
int main(void)
{
int num;
num = 1;
printf("I am a simple ");
printf("Computer. \n");
printf("My favorite number is %d besause it is first.\n",num);
return 0;
}
編譯執行:
[root@hans ~]# gcc -o first first.c
[root@hans ~]# ls -rlt first
-rwxr-xr-x 1 root root 8536 Aug 5 08:30 first
[root@hans ~]# ./first
I am a simple Computer.
My favorite number is 1 besause it is first.
C程式剖析
2. 程式剖析
C程式包含一個或多個函式,它們是C程式的基本模組。
/* */ C語言中的註釋,/* 和*/之間是註釋的內容。註釋只是為了幫助讀者理解程式,編譯器會忽略它們。
#include <stdio.h> /*這是程式的第1行,把stdio.h檔案中的所有內容都輸入該行所在的位置,#include這行程式碼是一條C前處理器指令(preprocessor directive).所有的C編譯器都提供stdio.h檔案,該檔案包含了供編譯器使用的輸入和輸出函式,該檔名的含義是標準輸入輸出標頭檔案。*/
int main(void) /*主函式,C程式一定是從main()函式開始執行,除了main函式外還可以隨意命名其他函式,但main()函式必須是開始函式
int是main()函式返回型別,表明main()函式返回的值是整數。函式名後面的圓括號中包含一些傳入函式的資訊,本例中沒有傳遞任何資訊。因此為void。*/
{ /*花括號裡面是函式體,所有的C函式都使用花括號標記函式整體的開始和結束,不能省略,而且必須是成對出現,這是開始*/
int num; /*變數宣告,表示設定一個變數num,它是int型別。
int是C語言中的一個關鍵字(keyword),表示C語言中資料型別,在C語言中所有的有變數都必須先宣告才能使用,變數命名時要使用有意義的變數名或識別符號。
C99和C11允許使用更長的識別符號名,但是編譯器只識別前63個字元。對於外部識別符號只允許使用31個字元。
可以用小寫字母、大寫字母、數字和下劃線(_)來命名,而且第一個字元必須是字元或下劃線,不能是數字。*/
num = 1;/*賦值,可以給num賦不同的值,但是賦得值必須都是int型別。賦值表示式語句從右側把值賦到左側*/
printf("I am a simple ");/*printf函式,利用printf函式把傳遞給printf函式的資訊輸出。()內的內容為引數,這種有特定值的為實參,形參是函式中用於儲存值的變數*/
printf("Computer. \n");
printf("My favorite number is %d besause it is first.\n",num);/*%d為佔位符,表明要在這裡列印一個變數,d表明變數為十進位制整數*/
return 0; /*int main(void) 表明main()函式執行完後返回一個整數,有返回值的C函式要有return語句,該語句以return為關鍵字開始,後面是待返回的值。並以分號結尾*/
} /*函式結束*/
宣告變數的4個理由:
- 把所有的變數放在一處,方便讀者查詢和理解程式的用途
- 宣告變數會促使你在編寫程式之前做一些計劃
- 宣告變數有助於發現隱藏在程式中的小錯誤,如變數名拼寫錯誤。
- 如果事先未宣告變數,C程式將無法通過編譯。
C99之前的標準要求把宣告都置於塊的頂部,好處是把宣告放在一起更容易理解程式的用途。C99允許在需要時才宣告變數,好處是在給變數賦值之前宣告變數就不會忘記給變數賦值。
2.1 提高程式可讀性的技巧
- 選擇有意義的函式名
- 程式要寫註釋
- 在函式中用空行分隔概念上的多個部分。
- 每條語句各佔一行。
2.3 列印多個值
#include <stdio.h>
int main(void){
printf("There are %d feet in %d fathoms\n", 12, 2);
return 0;
}
2.4 多個函式
#two_func.c
#include <stdio.h>
void butler(void); /*函式原型,C90標準新增。*/
int main(void){
printf("I will summon the butler function.\n");
butler();
printf("Yes. Bring me some tea and writeable DVDs.\n");
return 0;
}
void butler(void){ /*沒有返回值也沒有任何引數*/
printf("You rang, sir?\n")
}
/*
butler()函式的執行主要看在main()中什麼位置呼叫,而不是butler()函式在什麼位置.
如果寫了函式原型:void butler(void),則butler()函式放在什麼位置都可以。如果沒有寫,則butler()函式的定義一定要在呼叫它的函式的前面。
如果程式這樣寫則會在編譯時報錯:
#include <stdio.h>
/*void butler(void); 把這個函式原型註釋掉*/
int main(void){
printf("I will summon the butler function.\n");
butler();
printf("Yes. Bring me some tea and writeable DVDs.\n");
return 0;
}
void butler(void){ /*沒有返回值也沒有任何引數*/
printf("You rang, sir?\n")
}
*/
2.5 關鍵字和保留識別符號
ISO C關鍵字
auto | extern | short | while |
---|---|---|---|
break | float | signed | _Alignas |
case | for | sizeof | _Alignof |
char | goto | static | _Atomic |
const | if | struct | _Bool |
continue | inline | switch | _Complex |
default | int | typedef | _Generic |
do | long | unio | _Imaginary |
double | register | unsigned | _Noreturn |
else | restrict | void | _Static_assert |
enum | return | volatile | _Thread_local |
如果使用關鍵字不當,編譯器會將其視為語法錯誤。這些都不要用來做變數名。
3 程式設計練習
-
按格式列印名字
#include <stdio.h> int main(void){ printf("Hans Wang\n"); printf("Hans\nWang\n"); printf("Hans"); printf(" Wang\n"); } #gcc -o name name.c #./name Hans Wang Hans Wang Hans Wang
-
列印姓名和地址
#include <stdio.h> int main(void){ printf("name: Hans Wang\n"); printf("address: ShanDong HeZe\n"); return 0; }
-
把年齡轉換成天數,並顯示這兩個值,不考慮閏年
#include <stdio.h> int main(void){ int age; int day = 365; int days; printf("Please input your age:"); scanf("%d", &age); days = age * day; printf("Your age is %d,equel %d days.\n",age,days); return 0; }
-
生成指定輸出,除main()函式外還要呼叫兩個自定義函式
#include <stdio.h> void jolly(void); void deny(void); int main(void){ jolly(); jolly(); jolly(); deny(); return 0; } void jolly(void){ printf("For he's a jolly good fellow!\n"); } void deny(void){ printf("Which nobody can deny!\n"); }
-
生成指定輸出
#include <stdio.h> void br(void); void ic(void); int main(void){ br(); ic(); printf("India,China,\n"); printf("Brazil,Russia\n"); } void br(void){ printf("Brazil,Russia,"); } void ic(void){ printf("India,China\n"); }
-
編寫程式建立整型變數,計算變數的兩位和平方。
#include <stdio.h> int main(void){ int toes; toes = 10; int toes2; int toes_double; toes2 = 2 * toes; toes_double = toes * toes; printf("toes = %d\ntoes2 = %d\ntoes_double = %d\n", toes, toes2, toes_double); return 0; }
-
生成指定輸出simle。
#include <stdio.h> void smile(void){ printf("Smile!"); } int main(){ smile(); smile(); smile(); printf("\n"); smile(); smile(); printf("\n"); smile(); printf("\n"); return 0; }
-
寫一個程式,在函式中呼叫另一個函式
#include <stdio.h> void one_three(void); void two(void); int main(){ printf("starting now:\n"); one_three(); printf("done!\n"); return 0; } void one_three(void){ printf("one\n"); two(); printf("three\n"); } void two(void){ printf("two\n"); }