C語(yǔ)言編程基礎(chǔ)
1.C語(yǔ)言功能:類(lèi)似英語(yǔ),英語(yǔ)是實(shí)現(xiàn)人和人交流溝通的工具
C語(yǔ)言實(shí)現(xiàn)人和計(jì)算機(jī)交流溝通的工具
除了C語(yǔ)言,還有C++,JAVA,Python,Go,Rust等
2.C語(yǔ)言背景簡(jiǎn)介(了解)
1972年由丹尼斯里奇發(fā)明C語(yǔ)言
1978年出版《the c programming language》,預(yù)示著C語(yǔ)言正式走向世界
1989年發(fā)布C89標(biāo)準(zhǔn)(類(lèi)似普通話)
1999年發(fā)布C99標(biāo)準(zhǔn)(擴(kuò)展功能)
3.編寫(xiě)人生第一個(gè)標(biāo)準(zhǔn)C程序
具體實(shí)現(xiàn)步驟:
mkdir -p /home/tarena/stdc/day02
cd /home/tarena/stdc/day02
vim helloworld.c 添加如下內(nèi)容
/*
這是我的第一個(gè)C語(yǔ)言程序
我很激動(dòng)
*/
//這個(gè)僅僅作為一個(gè)測(cè)試
#include <stdio.h>
int main(void){
printf("你好,世界.");
printf("hello,world.\n");
return 0;
}
保存退出
繼續(xù)執(zhí)行以下命令:
gcc helloworld.c 作用:編譯程序
ls -lh 此時(shí)多了一個(gè)a.out文件
./a.out 作用:運(yùn)行a.out程序
4.總結(jié):C程序基本編程規(guī)范
a)C程序?qū)?yīng)的文件有兩種:
源文件:以.c結(jié)尾,例如:helloworld.cd
頭文件:以.h結(jié)尾,例如:stdio.hello
任何C程序必須有一個(gè)源文件,頭文件可以有,可以沒(méi)有
b)C程序注釋(就是程序diamante的解釋說(shuō),給程序員看,不參與程序的編譯和運(yùn)行)
1./*中間就是要解釋說(shuō)明的注釋內(nèi)容*/
? 優(yōu)點(diǎn):可以注釋多行
? 缺點(diǎn):不能嵌套注釋,例如:/*我是大神 /*我是小神*/ */ (錯(cuò)誤語(yǔ)法)
2.//注釋內(nèi)容
? 有點(diǎn):可以嵌套注釋,例如://////我是大神
? 缺點(diǎn):不能多行注釋
c)C程序要包含一個(gè)別人寫(xiě)好的頭文件(就是將頭文件的內(nèi)容全部拷貝過(guò)來(lái)),格式有兩種,
1.語(yǔ)法:#include <頭文件名>
? 例如:#include <stdio.h>
? 語(yǔ)義:告訴gcc編譯器將來(lái)默認(rèn)到linux系統(tǒng)的/usr/include目錄下找stdio.h開(kāi)頭的文件
找到之后將這個(gè)頭文件的內(nèi)容全部拷貝過(guò)來(lái)
2.語(yǔ)法:#include "頭文件名"
? 例如:#include "stdio.h"
? 語(yǔ)義:告訴gcc編譯器現(xiàn)在當(dāng)前目錄下找stdio.h頭文件,如果找到了,那就包含拷貝
如果沒(méi)有找到,再去/usr/include目錄下找頭文件stdio.h,如果找到那就包含拷貝
如果還沒(méi)找到础倍,報(bào)錯(cuò)
d)C程序必須要包含一個(gè)唯一的主函數(shù),名稱(chēng)必須交main
? 并且main函數(shù)的原型(),必須如下:
? int main(void){
//代碼內(nèi)容
? }
? 或者:
? int main(void)
? {
//代碼內(nèi)容
? }
? 結(jié)論:將來(lái)運(yùn)行C程序時(shí),linux操作系統(tǒng)之人main函數(shù),必須從main函數(shù)開(kāi)始從上往下挨個(gè)執(zhí)行
e)C程序的主函數(shù)main中(括號(hào)里面的內(nèi)容)編寫(xiě)規(guī)范:
? 1.每條語(yǔ)句后面必須跟分好";"
? 2.執(zhí)行順序:從上往下挨個(gè)執(zhí)行
? 3.只要遇到或者執(zhí)行return這個(gè)關(guān)鍵字,C程序立馬結(jié)束
return后面可以跟一個(gè)數(shù)字,例如:
return 0; 表示告訴操作系統(tǒng),此程序執(zhí)行結(jié)束了并且執(zhí)行的很正常
return -1; 表示告訴操作系統(tǒng),此程序執(zhí)行結(jié)束了但是執(zhí)行的時(shí)候有點(diǎn)問(wèn)題
例如:main函數(shù)的形式如下
int main(void){
printf("你好,世界.");
printf("hello,world\n");
return 0;
}
f)人生認(rèn)識(shí)的第一個(gè)標(biāo)準(zhǔn)C庫(kù)函數(shù)printf(就是大神寫(xiě)好的函數(shù),我們直接拿來(lái)用即可)
? 1.標(biāo)準(zhǔn)C庫(kù)函數(shù)使用,調(diào)用語(yǔ)法:函數(shù)名(信息);
? 2.printf函數(shù)的功能:向顯示器打印輸出信息
? 3.調(diào)用格式:printf("要輸出打印的信息\n");
注意:'\n':表示回車(chē)換行,就是打印完信息之后將光標(biāo)換到下一行
如果沒(méi)有'\n',光標(biāo)繼續(xù)停留在本行
例如:
printf("abc");
printf("efg\n");
效果:abcdefg
printf("abc\n");
printf("efg\n");
效果:
abc
efg
? 4.注意:要想調(diào)用大神的printf函數(shù),必須開(kāi)頭包含頭文件stdio.
? 5.printf利用占位符可以打印輸出指定的數(shù)字信息
? %d占位符功能:按照整數(shù)形式打印輸出一個(gè)數(shù)字
? 例如:printf("1 + 1 = %d\n",2); 語(yǔ)義:將來(lái)數(shù)字2會(huì)放到%d這個(gè)位置,然后將1+1=2這個(gè)信息輸出到顯示器上
printf("1 + 1 = %d\n",1+1); 語(yǔ)義:先算1+1=2,然后把計(jì)算的結(jié)果放在%d這個(gè)位置最后打印1+1=2
? 5.大名鼎鼎的gcc編譯器(作者:GNU軟件之父理查德斯托曼)
? a)gcc編譯器功能:類(lèi)似翻譯官,將C程序源文件和頭文件翻譯生成計(jì)算機(jī)能夠識(shí)別的可執(zhí)行文件
類(lèi)比:中文版三國(guó)(源文件)----->翻譯官(gcc編譯器)------>英文版三國(guó)(計(jì)算機(jī)識(shí)別的可執(zhí)行文件)
? b)gcc編譯源文件流程三步驟:
1.預(yù)處理:就是將源文件中要包含的頭文件,例如:stdio.h全部拷貝過(guò)來(lái)
? 此過(guò)程簡(jiǎn)稱(chēng)預(yù)處理
? 對(duì)應(yīng)的gcc命令選項(xiàng):-E
? 預(yù)處理的命令:gcc -E -o 預(yù)處理文件.i 源文件.c
? 注意:-o 后面只跟要生成的新文件
? 語(yǔ)義:對(duì)源文件進(jìn)行預(yù)處理生成預(yù)處理文件.i
2.只編譯不鏈接:就是將預(yù)處理文件進(jìn)行單獨(dú)翻譯生成計(jì)算機(jī)能夠識(shí)別的可執(zhí)行文件
但此時(shí)生成的文件不包含大神的代碼,例如:printf
所以此程序此時(shí)還不能運(yùn)行
對(duì)應(yīng)的gcc命令選項(xiàng):-c
對(duì)應(yīng)的gcc命令格式:gcc -c -o 可執(zhí)行文件.o 預(yù)處理文件.i
3.鏈接:就是講大神的各種代碼,例如printf和自己的程序合并起來(lái),合并的專(zhuān)業(yè)術(shù)語(yǔ)叫鏈接
最終生成計(jì)算機(jī)能夠執(zhí)行的一個(gè)完整程序
對(duì)應(yīng)的命令:gcc -o 可執(zhí)行文件 可執(zhí)行文件.o
最終生成可執(zhí)行文件
? c)務(wù)必掌握gcc編譯源文件的三種方式:
1.流氓發(fā):gcc helloworld.c 默認(rèn)都會(huì)生成a.out(這個(gè)名字做不到見(jiàn)名知意)
2.分步編譯:
gcc -E -o helloworld.i helloworld.c //先預(yù)處理
gcc -c -o helloworld.o helloworld.i //然后只編譯不鏈接
gcc -o helloworld helloworld.o //最后鏈接大神的printf代碼,最終生成helloworld可執(zhí)行程序
./helloworld //運(yùn)行程序
3.一步到位
gcc -o helloworld helloworld.c //直接對(duì)源文件進(jìn)行翻譯生成可執(zhí)行文件
? 心里要明白:gcc還要做三件事,只是看不到而已
./helloworld
案例:利用以上三種方法,對(duì)剛才的helloworld.c進(jìn)行編譯運(yùn)行
------------------------------------------------------------------------------------------------------------------
第三課:C語(yǔ)言(C程序)的變量
1.務(wù)必掌握計(jì)算機(jī)內(nèi)存相關(guān)的概念
? 內(nèi)存特點(diǎn):暫存CPU運(yùn)算之前的數(shù)據(jù)和運(yùn)算之后的數(shù)據(jù),還有暫存程序,任何程序都是在內(nèi)存中存儲(chǔ),
所以勢(shì)必要消耗內(nèi)存,速度快,掉電數(shù)據(jù)丟失
結(jié)論:任何程序最終都是玩內(nèi)存
? 字節(jié)(Byte):計(jì)算機(jī)將內(nèi)存分成一格一格,每一格用來(lái)存儲(chǔ)一格數(shù)字,每一格的專(zhuān)業(yè)術(shù)語(yǔ)叫字節(jié)
注意Byte的簡(jiǎn)稱(chēng):B
換算公式:1KB = 1024B
? 1MB = 1024 * 1024KB
? 1GB = 1024MB = 1024 * 1024KB = 1024 * 1024 * 1024B
? 地址(Address):計(jì)算機(jī)給內(nèi)存的每個(gè)字節(jié)指定一格固定的唯一的編號(hào),此編號(hào)從0開(kāi)始,后續(xù)地址加1即可
此編號(hào)的專(zhuān)業(yè)術(shù)語(yǔ)叫地址
切記:不管在哪里,只要知道了內(nèi)存的某個(gè)字節(jié)的地址,將來(lái)就可以通過(guò)地址對(duì)內(nèi)存進(jìn)行訪問(wèn)(讀或者寫(xiě))
類(lèi)似:不管快遞小哥在哪里,快遞小哥知道你的地址,就可以給你送快遞
? 存儲(chǔ)區(qū)(Buffer):計(jì)算機(jī)將1個(gè)字節(jié)或者多個(gè)連續(xù)的字節(jié)形成一個(gè)存儲(chǔ)單元用來(lái)存儲(chǔ)數(shù)字
例如:300億這個(gè)數(shù)字如果用1個(gè)字節(jié)來(lái)存儲(chǔ)顯然這個(gè)數(shù)字太大了,1字節(jié)內(nèi)存存不下
? 可以用4字節(jié)的連續(xù)內(nèi)存來(lái)存儲(chǔ)這個(gè)數(shù)字
? 首地址(base address):存儲(chǔ)區(qū)中第一個(gè)字節(jié)的地址又稱(chēng)首地址
? Q:C程序如何分配內(nèi)存空間來(lái)存儲(chǔ)數(shù)字呢晤碘?
? A:切記,任何程序要想訪問(wèn)內(nèi)存,必須先分配獲取到內(nèi)存才能訪問(wèn)
如果沒(méi)有分配獲取到內(nèi)存,直接去訪問(wèn):操作系統(tǒng)直接將程序干掉,殺死
C程序通過(guò)定義變量來(lái)實(shí)現(xiàn)分配的內(nèi)存!
2.變量功能:就是給C程序分配內(nèi)存空間,一旦分配內(nèi)存臭狗,程序就可以對(duì)內(nèi)存進(jìn)行存儲(chǔ)數(shù)字還可以修改存儲(chǔ)的數(shù)字
3.定義變量(又稱(chēng)分配內(nèi)存)語(yǔ)法格式:
? 數(shù)據(jù)類(lèi)型 變量名 = 初始值(可以有,可以沒(méi)有);
? 例如:int a = 250;
? 說(shuō)明:'int' 它是一個(gè)關(guān)鍵字,它對(duì)應(yīng)一種數(shù)據(jù)類(lèi)型,表示將來(lái)可以分配4字節(jié)的內(nèi)存空間
'a' 變量名
'250' 就是給分配的內(nèi)存放了一個(gè)數(shù)字250
? 結(jié)論:這條語(yǔ)句的結(jié)果是分配了4字節(jié)內(nèi)存空間并且這塊內(nèi)存空間放了一個(gè)數(shù)字250
? 例如:修改變量的值(也就是修改內(nèi)存存儲(chǔ)的數(shù)字)
int a = 250;
a = 520; //修改變量a的值為520,也就是將內(nèi)存中原先的數(shù)字250修改為520,其中"="就是重新賦值的意思
打印變量的值(打印內(nèi)存中存儲(chǔ)的數(shù)據(jù)值):printf("%d\n",a); //將變量a的值打印輸出
4.定義變量的四種形式:
? a)只定義(只分配內(nèi)存)不初始化(不賦初始值)
int a; //此時(shí)變量a的值或者對(duì)應(yīng)的內(nèi)存存儲(chǔ)的數(shù)字是一個(gè)隨機(jī)亂七八糟的數(shù)字
? b)定義并且初始化
int a = 250;
? c)連續(xù)只定義不初始化多個(gè)變量(逗號(hào)分隔)
int a,b,c; //同樣變量的值是亂七八糟的隨機(jī)數(shù)
? d)連續(xù)定義并且初始化多個(gè)變量
int a = 100, b = 200, c = 300;
小案例:演練變量的使用
實(shí)驗(yàn)步驟如下:
cd /home/tarena/stdc/day02
vim var.c
gcc -o var var.c //也可以分步編譯
./var
5.標(biāo)識(shí)符命名規(guī)則
? a)標(biāo)識(shí)符:就是變量名(例如:a,b,c,d等)或者函數(shù)名(例如:main,printf等)
? b)標(biāo)識(shí)符命名規(guī)則:
1.首字符不能是數(shù)字,只能是字母或者下劃線,區(qū)分大小寫(xiě)
? 例如:int 2var; //gcc報(bào)錯(cuò)
int v2ar; //可以
int _2var; //可以
2.盡量做到見(jiàn)名知意
? int a = 18; //你能知道a代表年齡的意思嗎曹体?
? int age = 18; //age就是年齡的意思
? int weight = 200; //體重
? int height = 200; //身高
3.駝峰(windows程序員)和下劃線(linux程序員)
? 駝峰:int nAge = 19;
int GreateWindows = 250;
? 下劃線:int Greate_windows = 250;
4.C語(yǔ)言的關(guān)鍵字不能使用
? 例如:int,return,main,void等不能用
? 例如:int int = 250; //gcc報(bào)錯(cuò)
int void = 250; //gcc報(bào)錯(cuò)
6.C語(yǔ)言的基本編程風(fēng)格:(不強(qiáng)求,其他風(fēng)格都要根據(jù)公司來(lái)定)
? a)各種該
該有空格的加空格
該對(duì)齊的對(duì)齊
該獨(dú)占一行的獨(dú)占一行
該有TAB鍵的就添加TAB鍵
例如:
int main(void){printf("hello,world\n");return 0;} //理論上可以,實(shí)際閱讀起來(lái)要命嫌吠!
應(yīng)該:
int main(void){
//獨(dú)占一行
//對(duì)齊
printf("abc\n");
printf("efg\n");
//獨(dú)占一行
}
? b)代碼盡量寫(xiě)在屏幕左側(cè)的2/3區(qū)域,右側(cè)1/3建議留白,如果超過(guò)換行