学习笔记3-C语言-基础
生活随笔
收集整理的這篇文章主要介紹了
学习笔记3-C语言-基础
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C語(yǔ)言簡(jiǎn)介
發(fā)展史:BCPL -> new B -> C -> Minix -> Linux -> gcc C語(yǔ)言誕生: 1970年~1973年,在肯.湯姆遜和丹尼斯.里奇(影響大)主導(dǎo)下編寫完成,歸屬美國(guó)貝爾實(shí)驗(yàn)室 C語(yǔ)言的誕生專門用于編寫操作系統(tǒng),所以天生適合一些硬件編程,也以速度快著稱,也非常適合實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和算法 由于出現(xiàn)時(shí)間過(guò)早,也沒(méi)想到普通人也能使用C語(yǔ)言編程,因此存在著很多缺陷,但是前輩已經(jīng)總結(jié)了一些避免陷阱的經(jīng)驗(yàn) C語(yǔ)言三劍客:《C語(yǔ)言陷阱與缺陷》、《C指針》《C專家編程》 C語(yǔ)言語(yǔ)法很自由,自由也意味著危險(xiǎn),自由源于自律語(yǔ)法標(biāo)準(zhǔn):C89語(yǔ)法標(biāo)準(zhǔn),也是gcc默認(rèn)的語(yǔ)法標(biāo)準(zhǔn)C99語(yǔ)法標(biāo)準(zhǔn),對(duì)C語(yǔ)言的擴(kuò)展和增強(qiáng)C11語(yǔ)法標(biāo)準(zhǔn),全新的升級(jí)一、第一個(gè)C語(yǔ)言程序:helld world
#include<stdio.h> 開頭#預(yù)處理程序員寫的代碼不是標(biāo)準(zhǔn)C代碼,需要一段程序進(jìn)行翻譯成標(biāo)準(zhǔn)C代碼,負(fù)責(zé)翻譯的程序叫做預(yù)處理器,翻譯的過(guò)程叫預(yù)處理,被翻譯的代碼叫做預(yù)處理指令,以#開頭的都是預(yù)處理指令#include 的功能就是把一個(gè)頭文件導(dǎo)入到當(dāng)前文件夾中#include<>:從系統(tǒng)指定的目錄下加載xxx.h#include"":先從當(dāng)前目錄下加載xxx.h,如果找不到,再?gòu)南到y(tǒng)指定目錄找stdio.h 標(biāo)準(zhǔn)輸入輸出庫(kù)函數(shù)頭文件:以.h結(jié)尾的文件,里面存儲(chǔ)的是一些輔助性的代碼,絕大多數(shù)都是函數(shù)的聲明源文件:以.c結(jié)尾的文件,里面存儲(chǔ)的是功能性代碼C語(yǔ)言標(biāo)準(zhǔn)委員會(huì)為C語(yǔ)言以函數(shù)的形式提供了一些基礎(chǔ)的功能,這些函數(shù)都會(huì)封裝在libc.so庫(kù)中很多頭文件負(fù)責(zé)對(duì)libc.so庫(kù)中的代碼進(jìn)行聲明,stdio.h就是其中一個(gè)string.h stdlib.hint main()C語(yǔ)言以函數(shù)的形式來(lái)管理代碼,是管理代碼的最小單位,一個(gè)函數(shù)就是一段代碼的集合main函數(shù)是C程序的主函數(shù),是整個(gè)C程序的執(zhí)行入口和出口,有且只有一個(gè)int 是一種數(shù)據(jù)類型,表示函數(shù)的返回值類型是一個(gè)整數(shù)main函數(shù)的返回值返回給操作系統(tǒng),main函數(shù)是由操作系統(tǒng)所調(diào)用的,反映了該程序是如何結(jié)束的,通常有三種:正數(shù) 出現(xiàn)異常(別人的錯(cuò)誤)0 一切正常負(fù)數(shù) 出現(xiàn)錯(cuò)誤(自己的錯(cuò)誤)echo $? 可以獲取上一個(gè)程序的返回值 {printf("hello world");return 0; }printf/scanf都是標(biāo)準(zhǔn)庫(kù)中的函數(shù),負(fù)責(zé)輸入輸出數(shù)據(jù),用來(lái)調(diào)試程序 轉(zhuǎn)義字符:鍵盤上一些沒(méi)有的符號(hào),用一些特殊的字符來(lái)表示,這些特殊的字符就是轉(zhuǎn)義字符,\n就是其中之一。\n 換行\(zhòng)t 制表符,用于對(duì)齊數(shù)據(jù)\r 光標(biāo)回到行首\a 鈴響\b 退一個(gè)字符%% 表示%\\ 表示\ C語(yǔ)言中以分號(hào)作為一行代碼的結(jié)束標(biāo)注,使用{}來(lái)劃分區(qū)域二、編譯器
把人能看懂的代碼組成的文件,翻譯成計(jì)算機(jī)能看懂二進(jìn)制文件,由預(yù)處理器、編譯器、鏈接器組成。 gcc是HNU社區(qū)為了編譯Linux代碼而開發(fā)的一款免費(fèi)的編譯器,默認(rèn)采用C89語(yǔ)法標(biāo)準(zhǔn),-std=gnu99可以設(shè)置C99語(yǔ)法常用的參數(shù):-E 只顯示與處理的結(jié)果-c 只編譯不鏈接-o 指定輸出結(jié)果的名字-I 指定頭文件的加載路徑-S 進(jìn)行匯編,生成匯編代碼-l 指定要使用的庫(kù)文件-Wall 盡可能多的產(chǎn)生警告-Werror 把警告當(dāng)錯(cuò)誤處理-std 指定編譯語(yǔ)法-D 命令行定義宏三、C代碼變成可執(zhí)行程序的過(guò)程
1、預(yù)處理:把源文件翻譯成預(yù)處理文件 一般用于查看宏定義的替換結(jié)果,檢查宏函數(shù)gcc -E code.c 顯示預(yù)處理處理的結(jié)果 gcc -E code.c -o code.i 生成以i結(jié)尾的預(yù)處理文件 2、編譯:把預(yù)處理文件翻譯成匯編文件 理解C/C++代碼的底層工作原理 函數(shù)重載原理gcc -S code.i 生成以.s結(jié)尾的匯編文件 3、匯編: 把匯編文件翻譯成2進(jìn)制的目標(biāo)文件 生成代碼庫(kù)、靜態(tài)庫(kù)、共享庫(kù)gcc -c code.s 生成以o為結(jié)尾的目標(biāo)文件 4、鏈接:把若干個(gè)目標(biāo)文件合并成一個(gè)可執(zhí)行文件 多文件編程的基礎(chǔ)gcc code.o a.o b.o c.o ... 默認(rèn)生成一個(gè)a.out的可執(zhí)行文件四、不同的C文件類型
.h 頭文件.h.gch 頭文件的編譯結(jié)果,它會(huì)被優(yōu)先使用.c 源文件.i 預(yù)處理文件.s 匯編文件.o 目標(biāo)文件.a 靜態(tài)庫(kù).so 共享庫(kù)五、數(shù)據(jù)的儲(chǔ)存單位
Bit 比特 一個(gè)二進(jìn)制位,只能存0或者1,計(jì)算機(jī)中存儲(chǔ)數(shù)據(jù)的最小單位 Byte 字節(jié) 8個(gè)二進(jìn)制位,計(jì)算機(jī)中存儲(chǔ)數(shù)據(jù)的基本單位 KB 1024字節(jié) MB 1024KB GB 1024MB TB 1024GB PB 1024TB六、數(shù)據(jù)類型
為什么要對(duì)數(shù)據(jù)分類:1、現(xiàn)實(shí)生活中的數(shù)據(jù)都是自帶類別屬性2、對(duì)數(shù)據(jù)進(jìn)行分類可以節(jié)約儲(chǔ)存空間,提高運(yùn)行的效率C語(yǔ)言中的數(shù)據(jù)分為兩大類:自建(程序員自己設(shè)計(jì),例如:結(jié)構(gòu)、聯(lián)合、類)、內(nèi)建(C語(yǔ)言中自帶) 可以使用sizeof計(jì)算類型的字節(jié)數(shù)大小 sizeof(signed long) 整型:signed 有符號(hào)signed char 1 -128~127signed short 2 -32768~32767signed int 4 正負(fù)20億signed long 4或8(由操作系統(tǒng)位數(shù)決定)signed long long 8 以9開頭19位數(shù)字的整數(shù)注意:signed不加就代表加unsigned 無(wú)符號(hào)unsigned char 1 0~255unsigned short 2 0~65535unsigned int 4 0~40億unsigned long 4或8(由操作系統(tǒng)位數(shù)決定)unsigned long long 8 1開頭的20位正整數(shù)注意:由于定義無(wú)符號(hào)的數(shù)據(jù)是比較麻煩,標(biāo)準(zhǔn)庫(kù)把這些無(wú)符號(hào)的類型重新定義成以下的類型:需要包含一個(gè)頭文件<stdint.h>uint8_t uint16_t uint32_t uint64_t浮點(diǎn)型:float 4double 8long double 12或者16(根據(jù)系統(tǒng))注意:采用科學(xué)計(jì)數(shù)法存儲(chǔ),二進(jìn)制與真實(shí)的數(shù)據(jù)之間需要翻譯轉(zhuǎn)換,因此浮點(diǎn)型運(yùn)算速度就比整型要慢,編程時(shí)盡量采用整型小數(shù)點(diǎn)后六位有效判斷float類型的數(shù)據(jù)是否是0float num;if(num 0 <= 0.000001 || num >= -0.000001)字符型:char 字符其實(shí)就是符號(hào)或者圖案,但是,在內(nèi)存中存儲(chǔ)的是整數(shù),需要顯示字符時(shí),會(huì)根據(jù)ASCLL碼表中對(duì)應(yīng)關(guān)系來(lái)顯示相應(yīng)的符號(hào)或者圖案。0 '' 特殊字符,表示什么都沒(méi)有48 '0'65 'A'97 'a' 布爾型:由于先有了C語(yǔ)言后才有了bool類型,所以C語(yǔ)言不可能有真正的布爾類型,使用stdbool.h頭文件,該文件是對(duì)布爾類型做的模擬bool true false七、變量與常量
什么是變量:程序運(yùn)行期間數(shù)值可以發(fā)生改變的叫做變量,相當(dāng)于存儲(chǔ)數(shù)據(jù)的盒子。 定義: 類型 變量名;int num;取名規(guī)則:1、只能是由字母、數(shù)字、下劃線組成2、不能以數(shù)字開頭3、不能與32個(gè)C關(guān)鍵字重名4、見名知意【功能、類型、作用域...】 使用:賦值:num = 100;參與運(yùn)算:num*10;注意:C語(yǔ)言中變量的值默認(rèn)是隨機(jī)的,為了安全起見,一般都初始化為0變量的輸入輸出:int printf (const char *format,...);功能:輸出數(shù)據(jù)format: "雙引號(hào)包含的格式信息(提示信息+占位符)"...: 要輸出的變量的列表返回值: 輸出的字符的個(gè)數(shù)int scanf(const char *format,...);功能:從鍵盤輸入數(shù)據(jù)foemat:"由雙引號(hào)包括的格式信息(占位符)"...:要接收的變量的列表返回值:成功輸入的變量個(gè)數(shù)注意:scanf需要的是變量的類型、變量的地址,變量的地址 = &變量名練習(xí)1:定義各種類型的變量并初始化,使用scanf輸入,使用printf顯示 #include<stdio.h>int main(int argc,const char* argv[]) {char num_c=0;short num_s=0;int num_i=0;long num_l=0;long long num_ll=0;unsigned char num_uc=0;unsigned short num_us=0;unsigned int num_ui=0;unsigned long num_ul=0;unsigned long long num_ull=0;float num_f=0;double num_d=0;long double num_ld=0;printf("請(qǐng)輸入num的值:");scanf("%hhd%hd%d%ld%lld",&num_c,&num_s,&num_i,&num_l,&num_ll);scanf("%hhu%hu%u%lu%llu",&num_uc,&num_us,&num_ui,&num_ul,&num_ull);scanf("%f%lf%LF",&num_f,&num_d,&num_ld);printf("char=%hhd,short=%hd,int=%d,long=%ld,longlong=%lld",num_c,num_s,num_i,num_l,num_ll);printf("uchar=%hhu,ushort=%hu,uint=%u,ulong=%lu,ulonglong=%llu",num_uc,num_us,num_ui,num_ul,num_ull);printf("float=%f,double=%lf,longdouble=%LF",num_f,num_d,num_ld); } 類型占位符:C語(yǔ)言通過(guò)占位符來(lái)傳遞變量的類型 signed %hhd %hd %d %ld %lldunsigned %hhu %hu %u %lu %llu%f %lf %LF 什么是常量:程序運(yùn)行期間數(shù)值絕對(duì)不能改變的叫常量字面值常量100 'a' "hello world"枚舉常量宏常量100 int(默認(rèn)int)100l long100ll long long100u unsigned int100lu100llu3.14 默認(rèn)double類型3.14f float八、格式化輸入輸出
%nd 顯示n個(gè)字符寬度,如果不夠則補(bǔ)空格,右對(duì)齊 %-nd 顯示n個(gè)字符寬度,如果不夠則補(bǔ)空格,左對(duì)齊 %0nd 顯示n個(gè)字符寬度,如果不夠則補(bǔ)0,右對(duì)齊 %n.mf 顯示n個(gè)字符寬度,小數(shù)也算一位,不夠則補(bǔ)空格,m表示小數(shù)點(diǎn)后的位數(shù)(四舍五入) %g 不顯示小數(shù)點(diǎn)后多余的0九、運(yùn)算符
自變運(yùn)算符:前后++/--,使變量的值自動(dòng)加1或者減1前自變 立即有效后自變 下一句語(yǔ)句生效注意:不要再一行語(yǔ)句中多次使用自變運(yùn)算符算數(shù)運(yùn)算符+ - * / %/ % 除數(shù)不能為0,會(huì)造成浮點(diǎn)數(shù)例外,核心已轉(zhuǎn)儲(chǔ),程序直接死掉整數(shù)/整數(shù) 結(jié)果沒(méi)有小數(shù)部分關(guān)系運(yùn)算符> < >= <= == !=比較的結(jié)果是0(假)或1(真),運(yùn)算結(jié)果可以繼續(xù)參與運(yùn)算 if(a>b==0)int num = 500;0<num<100;永遠(yuǎn)為真邏輯運(yùn)算符&& || !比較對(duì)象轉(zhuǎn)換為邏輯值,0轉(zhuǎn)換成假,非0轉(zhuǎn)換為真A && B 一假為假A || B 一真為真!A 求反&&、|| 具有短路特性:當(dāng)左邊的表達(dá)式可以確定整個(gè)表達(dá)式的結(jié)果時(shí),右邊不進(jìn)行計(jì)算三目運(yùn)算符運(yùn)算對(duì)象有3個(gè)A?B:C 先判斷A的表達(dá)式真假,若為真執(zhí)行B,假執(zhí)行C注意:該語(yǔ)句不能使用流程控制語(yǔ)句,因?yàn)樗仨氁羞\(yùn)行結(jié)果賦值運(yùn)算符= += -= *= /=num+=100 <=> num=num+100位運(yùn)算符& | ~ ^ >> <<后邊講十、類型轉(zhuǎn)換
自動(dòng)類型轉(zhuǎn)換:只有相同類型的數(shù)據(jù)才能進(jìn)行運(yùn)算,不同類型數(shù)據(jù)自動(dòng)轉(zhuǎn)換成相同類型再進(jìn)行計(jì)算:轉(zhuǎn)換規(guī)則(以不丟失數(shù)據(jù)為基礎(chǔ),適當(dāng)犧牲一些空間)1、字節(jié)少的向字節(jié)多的轉(zhuǎn) 考慮優(yōu)先級(jí)2、有符號(hào)向無(wú)符號(hào)的轉(zhuǎn)3、整型向浮點(diǎn)型轉(zhuǎn)強(qiáng)制類型轉(zhuǎn)換:(想要轉(zhuǎn)成的類型)原數(shù)據(jù);int num;(short)num;注意:有丟失數(shù)據(jù)風(fēng)險(xiǎn),慎重使用十一、分支語(yǔ)句
if(表達(dá)式) //單分支 {表達(dá)式為真,執(zhí)行此處代碼 }if(表達(dá)式) //雙分支 {表達(dá)式為真,執(zhí)行此處代碼 } else {表達(dá)式為假,執(zhí)行此處代碼 }if(表達(dá)式1) //多分枝 {表達(dá)式1為真,執(zhí)行此處代碼 } else if(表達(dá)式2) {表達(dá)式2為真,執(zhí)行此處代碼 } else if(表達(dá)式3) {表達(dá)式3為真,執(zhí)行此處代碼 } else {當(dāng)表達(dá)式123都為假時(shí)執(zhí)行此處代碼 }作業(yè)
作業(yè)1:輸入三個(gè)整數(shù)(鍵盤),從大到小顯示。 #include<stdio.h>int main(int argc,const char* argv[]) {int a[3];int i,k,j;printf("請(qǐng)輸入三個(gè)整數(shù)");for(i=0;i<3;i++){scanf("%d",&a[i]);}for(i=0;i<3;i++){for(j=i+1;j<3;j++){if(a[i]<a[j]){ k=a[i];a[i]=a[j];a[j]=k;} }}for(i=0;i<3;i++){printf("%d",a[i]);}return 0; } 作業(yè)2:輸入一個(gè)年份,判斷是否時(shí)閏年 #include<stdio.h>int main(int argc,const char* argv[]) {int year;printf("請(qǐng)輸入年份");scanf("%d",&year);if(year % 400 == 0){printf("是閏年");}else if(year % 4 == 0 && year % 100 != 0){printf("是閏年"); }else{printf("不是閏年");}} 作業(yè)3:輸入一個(gè)年份與月份,判斷該月多少天 #include<stdio.h>int main(int argc,const char* argv[]) {int year,mon;printf("請(qǐng)輸入年份");scanf("%d",&year);printf("請(qǐng)輸入月份"); scanf("%d",&mon);if(year % 400 != 0 && year % 4 != 0){if(mon==2){printf("該月28天"); }else if(mon==4 || mon==6 || mon==9 || mon==11){printf("該月30天");}else if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12){printf("該月31天"); }else{printf("輸入錯(cuò)誤"); }}else{if(mon==2){printf("該月29天"); }else if(mon==4 || mon==6 || mon==9 || mon==11){printf("該月30天");}else if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12){printf("該月31天"); }else{printf("輸入錯(cuò)誤"); }}return 0; } 作業(yè)4:輸入一個(gè)三位整數(shù),判斷是否是水仙花數(shù) #include<stdio.h>int main(int argc,const char* argv[]) {int g,s,b;int num;printf("請(qǐng)輸入一個(gè)三位整數(shù)");scanf("%d",&num);b=num/100;s=num%100/10;g=num%10;if(num>=100 && num<=999){if(num==g*g*g+s*s*s+b*b*b){printf("是水仙花數(shù)");}else{printf("不是水仙花數(shù)");}}else{printf("請(qǐng)仔細(xì)審題");}return 0; } 作業(yè)5:輸入一個(gè)成績(jī),判斷該成績(jī)的等級(jí) #include<stdio.h>int main(int argc,const char* argv[]) {int cj;printf("請(qǐng)輸入成績(jī)");scanf("%d",&cj);if(cj<0 || cj>100){printf("輸入錯(cuò)誤"); }else{if(cj<=100 && cj>=90){printf("A");} else if(cj<90 && cj>=80){printf("B");} else if(cj<80 && cj>=70){printf("C");} else if(cj<70 && cj>=60){printf("D");} else if(cj<60 && cj>=0){printf("E");} }return 0; }總結(jié)
以上是生活随笔為你收集整理的学习笔记3-C语言-基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 什么是基金分位点
- 下一篇: leetcode976. 三角形的最大周