1.什么是c語言
C語言是一門面向程序的計算機編程語言,與C++、Java等面向物件編程語言有所不同,C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存盤器、僅產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言,C語言描述問題比匯編語言迅速、作業量小、可讀性好、易于除錯、修改和移植,而代碼質量與匯編語言相當,C語言一般只比匯編語言代碼生成的目標程式效率低10%-20%,因此,C語言可以撰寫系統軟體,
-
(1) 語言組成
資料型別
C的資料型別包括:整型(short、int、long、long long)、字符型(char)、實型或浮點型(單精度float和雙精度double)、列舉型別(enum)、陣列型別、結構體型別(struct)、共用體型別(union)、指標型別和空型別(void),
常量與變數
常量其值不可改變,符號常量名通常用大寫,
變數是以某識別符號為名字,其值可以改變的量,識別符號是以字母或下劃線開頭的一串由字母、數字或下劃線構成的序列,請注意第一個字符必須為字母或下劃線,否則為不合法的變數名,變數在編譯時為其分配相應存盤單元,
陣列
如果一個變數名后面跟著一個有數字的中括號,這個宣告就是陣列宣告,字串也是一種陣列,它們以ASCII的NULL作為陣列的結束,要特別注意的是,中括號內的索引值是從0算起的,
指標
如果一個變數宣告時在前面使用*號,表明這是個指標型變數,換句話說,該變數存盤一個地址,而*(此處特指單目運算子*,下同,C語言中另有雙目運算子*)則是取內容運算子,意思是取這個記憶體地址里存盤的內容,指標是C語言區別于其他同時代高級語言的主要特征之一,
指標不僅可以是變數的地址,還可以是陣列、陣列元素、函式的地址,通過指標作為形式引數可以在函式的呼叫程序得到一個以上的回傳值,不同于return(z)這樣的僅能得到一個回傳值,
指標是一把雙刃劍,許多操作可以通過指標自然的表達,但是不正確的或者過分的使用指標又會給程式帶來大量潛在的錯誤,
字串
C語言的字串其實就是以'\0'字符結尾的char型陣列,使用字符型并不需要參考庫,但是使用字串就需要C標準庫里面的一些用于對字串進行操作的函式,它們不同于字符陣列,使用這些函式需要參考頭檔案,
檔案輸入/輸出
在C語言中,輸入和輸出是經由標準庫中的一組函式來實作的,在ANSI C中,這些函式被定義在頭檔案中,
標準輸入/輸出
有三個標準輸入/輸出是標準I/O庫預先定義的:
stdin標準輸入
stdout標準輸出
stderr輸入輸出錯誤
運算
C語言的運算非常靈活,功能十分豐富,運算種類遠多于其它程式設計語言,在運算式方面較其它程式語言更為簡潔,如自加、自減、逗號運算和三目運算使運算式更為簡單,但初學者往往會覺的這種運算式難讀,關鍵原因就是對運算子和運算順序理解不透不全,當多種不同運算組成一個運算運算式,即一個運算式中出現多種運算子時,運算的優先順序和結合規則就會顯得十分重要,
-
(2)關鍵字
關鍵字又稱為保留字,就是已被C語言本身使用,不能作其它用途使用的字,例如關鍵字不能用作變數名、函式名等識別符號,
資料型別關鍵字
short:修飾int,短整型資料,可省略被修飾的int,
long:修飾int,長整型資料,可省略被修飾的int,
long long:修飾int,超長整型資料,可省略被修飾的int,
signed:修飾整型資料,有符號資料型別,
unsigned:修飾整型資料,無符號資料型別,
restrict:用于限定和約束指標,并表明指標是訪問一個資料物件的初始且唯一的方式,
復雜型別關鍵字
struct:結構體宣告,
union:聯合體宣告,
enum:列舉宣告,
typedef:宣告型別別名,
sizeof:得到特定型別或特定型別變數的大小,
inline:行內函式用于取代宏定義,會在任何呼叫它的地方展開,
存盤級別關鍵字
auto:指定為自動變數,由編譯器自動分配及釋放,通常在堆疊上分配,與static相反,當變數未指定時默認為auto,
static:指定為靜態變數,分配在靜態變數區,修飾函式時,指定函式作用域為檔案內部,
register:指定為暫存器變數,建議編譯器將變數存盤到暫存器中使用,也可以修飾函式形參,建議編譯器通過暫存器而不是堆疊傳遞引數,
extern:指定對應變數為外部變數,即標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模塊中尋找其定義,
const:指定變數不可被當前執行緒改變(但有可能被系統或其他執行緒改變),
volatile:指定變數的值有可能會被系統或其他執行緒改變,強制編譯器每次從記憶體中取得該變數的值,阻止編譯器把該變數優化成暫存器變數,
流程控制關鍵字
跳轉結構
return:用在函式體中,回傳特定值(如果是void型別,則不回傳函式值),(K&R時期引入)
continue:結束當前回圈,開始下一輪回圈,
break:跳出當前回圈或switch結構,
goto:無條件跳轉陳述句,
分支結構
if:條件陳述句,后面不需要放分號,
else:條件陳述句否定分支(與if連用),
switch:開關陳述句(多重分支陳述句),
case:開關陳述句中的分支標記,與switch連用,
default:開關陳述句中的“其他”分支,可選,
-
(3)語法結構
順序結構
順序結構的程式設計是最簡單的,只要按照解決問題的順序寫出相應的陳述句就行,它的執行順序是自上而下,依次執行,
例如:a=3,b=5,現交換a、b的值,這個問題就好像交換兩個杯子里面的水,這當然要用到第三個杯子,假如第三個杯子是c,那么正確的程式為:c=a;a=b;b=c,執行結果是a=5,b=c=3,如果改變其順序,寫成:a=b;c=a;b=c;則執行結果就變成a=b=c=5,不能達到預期的目的,初學者最容易犯這種錯誤,順序結構可以獨立使用構成一個簡單的完整程式,常見的輸入、計算、輸出三步曲的程式就是順序結構,例如計算圓的面積,其程式的陳述句順序就是輸入圓的半徑r,計算s=3.14159*r*r,輸出圓的面積s,不過大多數情況下順序結構都是作為程式的一部分,與其它結構一起構成一個復雜的程式,例如分支結構中的復合陳述句、回圈結構中的回圈體等,
選擇結構
順序結構的程式雖然能解決計算、輸出等問題,但不能做判斷再選擇,對于要先做判斷再選擇的問題就要使用選擇結構,選擇結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照陳述句出現的物理順序,選擇結構的程式設計方法的關鍵在于構造合適的分支條件和分析程式流程,根據不同的程式流程選擇適當的選擇陳述句,選擇結構適合于帶有邏輯或關系比較等條件判斷的計算,設計這類程式時往往都要先繪制其程式流程圖,然后根據程式流程寫出源程式,這樣做把程式設計分析與語言分開,使得問題簡單化,易于理解,程式流程圖是根據解題分析所繪制的程式執行流程圖,
回圈結構
回圈結構可以減少源程式重復書寫的作業量,用來描述重復執行某段演算法的問題,這是程式設計中最能發揮計算機特長的程式結構,C語言中提供四種回圈,即goto回圈、while回圈、do while回圈和for回圈,四種回圈可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto回圈,因為強制改變程式的順序經常會給程式的運行帶來不可預料的錯誤,
特別要注意在回圈體內應包含趨于結束的陳述句(即回圈變數值的改變),否則就可能成了一個死回圈,這是初學者的一個常見錯誤,
三個回圈的異同點:用while和do while回圈時,回圈變數的初始化的操作應在回圈體之前,而for回圈一般在陳述句1中進行的;while回圈和for回圈都是先判斷運算式,后執行回圈體,而do while回圈是先執行回圈體后判斷運算式,也就是說do while的回圈體最少被執行一次,而while回圈和for就可能一次都不執行,另外還要注意的是這三種回圈都可以用break陳述句跳出回圈,用continue陳述句結束本次回圈,而goto陳述句與if構成的回圈,是不能用break和continue陳述句進行控制的,
順序結構、分支結構和回圈結構并不彼此孤立的,在回圈中可以有分支、順序結構,分支中也可以有回圈、順序結構,其實不管哪種結構,均可廣義的把它們看成一個陳述句,在實際編程程序中常將這三種結構相互結合以實作各種演算法,設計出相應程式,但是要編程的問題較大,撰寫出的程式就往往很長、結構重復多,造成可讀性差,難以理解,解決這個問題的方法是將C程式設計成模塊化結構,
具體內容:
for回圈
for回圈結構是c語言中最具有特色的回圈陳述句,使用最為靈活方便,它的一般形式為:
for(運算式1;運算式2;運算式3)回圈體陳述句,(其中;不能省略)
運算式1為初值運算式,用于在回圈開始前為回圈變數賦初值,
運算式2是回圈控制邏輯運算式,它控制回圈執行的條件,決定回圈的次數,
運算式3為回圈控制變數修改運算式,它使for回圈趨向結束,
回圈體陳述句是在回圈控制條件成立的情況下被反復執行的陳述句,
但是在整個for回圈程序中,運算式1只計算一次,運算式2和運算式3則可能計算多次,也可能一次也不計算,回圈體可能多次執行,也可能一次都不執行,
先執行運算式2,然后執行回圈結構,最后運算式3,一直這樣回圈下去,
for回圈陳述句是c語言種功能最為強大的陳述句,甚至在一定程度上可以代替其他的回圈陳述句,
do
do回圈結構,do 1 while(2);的執行順序是1->2->1...回圈,2為回圈條件,
while
while回圈結構,while(1) 2;的執行順序是1->2->1...回圈,1為回圈條件
以上回圈陳述句,當回圈條件運算式為真則繼續回圈,為假則跳出回圈,
-
(4)函式
C程式是由一組變數或是函式的外部物件組成的,函式是一個自我包含的完成一定相關功能的執行代碼段,我們可以把函式看成一個“黑盒子”,你只要將資料送進去就能得到結果,而函式內部究竟是如何作業的,外部程式是不知道的,外部程式所知道的僅限于輸入給函式什么以及函式輸出什么,函式提供了編制程式的手段,使之容易讀、寫、理解、排除錯誤、修改和維護,
C程式中函式的數目實際上是不限的,如果說有什么限制的話,那就是,一個C程式中必須至少有一個函式,而且其中必須有一個并且僅有一個以main為名的函式,這個函式稱為主函式,整個程式從這個主函式開始執行,
C語言程式鼓勵和提倡人們把一個大問題劃分成一個個子問題,對應于解決一個子問題編制一個函式,因此,C語言程式一般是由大量的小函式而不是由少量大函式構成的,即所謂“小函式構成大程式”,這樣的好處是讓各部分相互充分獨立,并且任務單一,因而這些充分獨立的小模塊也可以作為一種固定規格的小“構件”,用來構成新的大程式,
C語言發展的那么多年來,用C語言開發的系統和程式浩如煙海,在發展的同時也積累了很多能直接使用的庫函式,
ANSIIC提供了標準c語言庫函式,
-
(5)運算子號
比較特別的是,位右移(>>)運算子可以是算術(左端補最高有效位)或是邏輯(左端補0)位移,例如,將11100011右移3位元位,算術右移后成為11111100,邏輯右移則為00011100,因算術位元位右移較適于處理帶負號整數,所以幾乎所有的編譯器都是算術位元右移,
運算子的優先級從高到低大致是:單目運算子、算術運算子、關系運算子、邏輯運算子、條件運算子、賦值運算子(=)和逗號運算子,
2.第一個c語言程式
#include <stdio.h>
int main()
{
printf("hello world\n");
printf("he he\n");
return 0;
}
//解釋:
//main函式是程式的入口
//一個工程中main函式有且僅有一個
3.基本資料型別
char //字符資料型別
short //短整型
int //整形
long //長整型
long long //更長的整形
float //單精度浮點數
double //雙精度浮點數
那么每種型別的大小就是:

4.變數和常量
生活中的有些值是不變的(比如:圓周率,性別(?),身份證號碼,血型等等) ,有些值是可變的(比如:年齡,體重,薪資),
不變的值c語言用常量表示,會變的量用變數表示;
-
(1)變數
定義變數的方法
char ch='a';
int age=20;
float high=180.5;
變數的分類
- 區域變數
- 全域變數
#include <stdio.h>
int global = 2019;//全域變數
int main()
{
int local = 2018;//區域變數
int global = 2020;//區域變數
printf("global = %d\n", global);
return 0;
}
值得注意的是,當區域變數和全域變數同名時,區域變數優先使用,
變數的使用
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("輸入兩個運算元:>");
scanf("%d %d", &a, &b);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
變數的作用域和生命周期
作用域,程式設計概念,通常來說,一段程式代碼中所用到的名字并不總是有效/可用 的 而限定這個名字的可用性的代碼范圍就是這個名字的作用域,
1. 區域變數的作用域是變數所在的區域范圍,
2. 全域變數的作用域是整個工程,
生命周期, 變數的生命周期指的是變數的創建到變數的銷毀之間的一個時間段,
1. 區域變數的生命周期是:進入作用域生命周期開始,出作用域生命周期結束,
2. 全域變數的生命周期是:整個程式的生命周期,
(2)常量
C語言中的常量分為以下以下幾種:
- 字面常量
- const 修飾的常變數
- #define 定義的識別符號常量
- 列舉常量
#include <stdio.h>
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括號中的MALE,FEMALE,SECRET是列舉常量
int main()
{
3.14;//字面常量
1000;//字面常量
const float pai = 3.14; //const 修飾的常量
pai = 5.14;
#define MAX 100 //#define的識別符號常量
return 0;
}
5.字串+轉義字符+注釋
-
字串
"hello world!\n"
注意:字串的結束標志是一個'\0' 的轉義字符,在計算字串長度的時候 \0 是結束標志,不算作字串 內容,
接下來展示'\0'的重要性:

這里的arr1為字串陣列,“bit”中本身含有‘\0’,所以能列印bit,
arr2為字符陣列,沒有‘\0’,所以列印不會結束,bit之后是文字,
而arr3則有‘\0’,所以能列印bit,
-
轉義字符
假如我們要在螢屏上列印一個目錄: c:\program\test.c ,我們該如何寫代碼?
#include <stdio.h>
int main()
{
printf("c:\program\test.c\n");
return 0;
}
這是我們認為的;但列印出來是:

這里就得介紹一下轉義字符:

注意:
1. 區分,斜杠:"/" 與 反斜杠:"\" ,此處不可互換
2. \xhh 十六進制轉義不限制字符個數 '\x000000000000F' == '\xF' ;
所以正確寫法應該是:

在螢屏上列印一個單引號和雙引號:
printf("%c",'\'');//列印字符的單引號
printf("%s","\"");//列印字串的雙引號
下面來看一個轉義字符的應用:

注意:這里的“:”號算一個字符,“\t”算一個字符,“\32”是8進制所代表的字符,而8進制只有0到7,沒有8,所以“\328”算為兩個字符,結果為14.
-
注釋
1. 代碼中有不需要的代碼可以直接洗掉,也可以注釋掉
2. 代碼中有些代碼比較難懂,可以加一下注釋文字
c語言注釋風格:
/* xxxxxx*/
缺點:不能嵌套注釋,
c++語言注釋風格:
// xxxxxx//
可以注釋一行也可以注釋多行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/274772.html
標籤:其他
