第一課 C語言簡明教程
1序言:
1與Java、C#等高級語言相比,C語言卻非常簡單,學習簡單,使用也簡單,但是也非常重要,到目前為止基本上操作系統的內核代碼超過百分之九十使用C語言完成,因此學好C語言是學好計算機這門課程的基礎,特別是進入系統編程尤為明顯。
今天是本人復習C語言課程的第一課,主要重新記錄一下C語言的基礎知識,這節課涉及到C語言的結構、變量以及類型、輸入輸出、條件判斷以及循環知識。
2知識點:
2.1 C語言的結構
2.1.1 通常情況下C語言程序是由:
1.相關的代碼注釋,使用/* ··· */可注釋單行或多行,也可以用//單行注釋(C99標准);
2.定義相關變量,全局(靜態)變量或局部(靜態)變量;
3.具有返回值int的main入口函數;
4.如果使用外部函數則需要引入頭文件;
5.可有可無返回值其他函數方法;
6.使用代碼塊表示程序的相關判斷;
下面來看下代碼;
#include <stdio.h> #調用系統函數則需要使用此頭文件
/* 入口函數 */
int main(void) #程序入口函數main,此時參數值為void代表未傳參數
{ #main入口函數從這裡開始,代碼塊開始處
int data; #此data局部變量未初始化且後面未賦值如果直接輸出其值是未知的
static int cdata; #未初始化局部靜態變量為0存儲與bass,以初始化的存儲於data
char* p = "Hello World!\n"; #定義局部變量p並賦值
printf(p); #調用系統函數,此函數在stdio.h中
int flag = Show(p); #調用具有返回類型為int的自定義函數Show(char* p)
return 0; #該方法具有返回值int
} #main代碼塊結束處
/* Show函數
參數:char* p
返回值:int
*/
int Show(char* p)
{
printf(p);
return 1;
},
//全局變量
int golbal_data; #未初始化的變量(存儲bss)為0,已初始化的全局變量存儲在data
2.2 變量以及類型
2.2.1 數據類型
看如下圖:
其中[]中括號代表可有可無;int類型范圍取值是:-2^(32-1)至2^(32-1)-1,因此類推其他也是這樣計算;int、float、double都是表示最少位數,因為跟操作系統位數有關,比如long intzai 32位操作系統下,跟int類型占用字節數是一樣的,但是在64位下就不同,long int是8個字節的。當然還有一些類型比如iso c99擴展類型:int8_t總是8位,int16_t總是16位。可用sizeof(int)、sizeof(long)打印出其在當前平台下的占用字節數。一般盡量使用int類型:效率比較高;double精度夠;盡量少用unsigned.
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(long));
printf("%d\n",sizeof(char));
printf("%d\n",sizeof(float));
printf("%d\n",sizeof(double));
2.2.2 常量表示
2.2.2.1 常量分為:數值常量、字符常量、字符串常量、符號常量,看如下代碼:
const int i = 123; #代表整型常量
const int i = 033; #代表整型常量使用八進制表示
const int i = 0x1; #使用十六進制表示
const float f = 1.2222;#單精度浮點型,默認帶f
const double b = 123.1234567d; #雙精度浮點型使用d表示
const char c = 'a'; #字符常量
const char cn = '\\'; #斜槓轉義
2.2.2.1 看如下代碼:
pirntf("%d\n",100); #整型直接表示
pirntf("%o\n",100); #八進制表示
pirntf("%x\n",100); #十六進制表示
pirntf("%f\n",1.1111f); #單精度表示,單精度常量用f表示
pirntf("%f\n",1.11111111L); #雙精度用單精度表示只顯示小數點6位數,常量後面使用L表示雙精度
2.3 格式化輸出
2.3.1 使用占位符輸出,看如下代碼:
int a = 100;
float f = 1.123456f;
double d = 1.12345678L;
char c = 'A';
printf("%d\n",a); #使用%d輸出整型a;%u:表示無符號十進制;%ld代表長整型。其中前面可以加上數量比如%2d代表2位;
printf("%f\n",f); #使用%f輸出浮點型f;%2f代表2位浮點型;%2.3f代表2位整數3位小數;%-2.3f同理前面不過且向左靠齊,小數點不夠補0對齊。
printf("%c\n",c); #使用%c輸出字符c;
具體可以看看這邊文章。
2.4 條件判斷
2.4.1 運算符
2.4.1.1 通常情況下我們常用的運算符:
一級:(),[],.,->是按左至右順序;
二級:-(負號),++,--,*(取值),&,!,~單目運算符是按右至左,這裡特別注意++跟--有前置跟後置區分;sizeof表達式;
三級:*,/,%是按左至右計算;
四級:+,-是按左至右計算;
五級:<<,>>是按左至右計算;
六級:>,>=,<,<=是按左至右計算;
七級:==,!=是按左至右計算;
還有一些這裡就不一一列舉了比如復合運算符,大家可以看看這邊文章這比較詳細了。
2.4.2 條件判斷
2.4.2.1 常見條件判斷,看如下幾種:
int a = 0;
#單if判斷
if(a == 0)
{
//當a=0操作
}
#if-else判斷
if(a==0)
{
//當a等於0時操作
}
else
{
//當a不等於0時操作
}
#if-elseif-else判斷,中間可以有多個else if,最後的else也可有可無
if(a == 0)
{
#當a等於0時操作
}
else if(a == 1)
{
#當a等於1時操作
}
。
。
。
else
{
#前面條件不符合運行這,相當於默認操作
}
2.4.2.3 創建類型的邏輯判斷,看如下:
int a = 0;
int b = 1;
int c = 2;
if(a == 0 || b == 2) #因為是邏輯或會產生短路(一個為真結果就真不會再去判斷b是否等於2)
{
#操作
}
if(a == 0 && b == 2) #因為是邏輯與也會產生短路(1個為假時結果就為假不會再判斷b是否等於2)
{
#操作
}
if(a == 0 || b == 2 && c == 1) #因為&&運算符比較高,此相當於a == 0 || 0這樣結果為真
{
#操作
}
2.4.2.3 switch條件
switch(variable)
{
case A:
//program code
break;
case B:
//program code
break;
case C:
//program code
break; #這個break語句一般情況都會有,當然不排除case one,case two都執行
…
default: #養成習慣最後的default一定要有即使沒語句;
break;
}
#這個variable關心最多的是什麼類型,這裡說下:int,char,byte,short是不是就只是這幾個呢,答案是:#ANSI標明是所有類型。但是在某些平台下也會報錯的不能所有類型,不過一般能轉整型的據可以,包括枚舉。float一般不用都會報錯!!!
2.5 循環語句
2.5.1 for循環,看如下代碼:
int a = 10;
for(int b = 0;b < a; b++)
{
printf("%d\n",b);
}
#也可以寫出如下,下面的循環b = 0設置都可以省略
int a = 10;
int b = 0;
for(b=0;b < a; b++)
{
printf("%d\n",b)
}
#一般情況下我們大都是使用第一張方式
2.5.2 while 以及do-while(),看如下代碼:
#上面的for語句可以改寫
int a = 10;
int b = 0;
while(b < a)
{
printf("%d\n",b);
}
#也可以使用do-while()語句,但是結果卻不一樣因為這個語句先執行在判斷所以它比前面的循環多了一次如下
int a = 10;
int b = 0;
do
{
printf("%d\n",b);
}while(b < a)