C语言学习day1、2
目錄
一、C語言簡介
二、Linux上第一個C語言程序
三、編譯器
四、C代碼變成可執行文件的詳細過程:
五、C語言的文件類型:
六、存儲空間的單位:
七、數據類型
八、變量與常量
九、格式化輸入輸出
十、運算符
十一、分支語句 if? ?
十二、分支語句 switch開關分支語句
十三、循環語句 for
十四、循環語句 while
十五、循環語句 do-while
十六、循環嵌套
一、C語言簡介
? ? BCPL->new B->C語言->UNIX->Minix->Linux->gcc
? ? C語言誕生于1970~1973年,在肯.湯普遜和丹尼斯.里奇的編寫下完成,歸屬于美國貝爾實驗室。
? ? C語言是專門用于編寫操作系統而發明的編程語言,所以天生適合對硬件編程,也以運行速度快而著稱,也非常適合實現數據結構和算法
? ? 由于出現的時間過早,有很多缺陷,已存在著很多的陷阱,但是我們的前輩給總結了一些避免陷阱的經驗教訓 《C陷阱與缺陷》
? ? C語言的語法很自由,但是也意味著危險
? ? 自由源于自律
? ? C89語法標準,默認是gcc編譯器的語法標準
? ? C99語法標準,對C語言的擴展和增強
? ? ? ? Ubuntu 16.04 默認C99 ?
? ? ? ? -std=gnu99 指定為C99語法標準
? ? ?C11語法標準,全新的升級
二、Linux上第一個C語言程序
? ? 1、vim xxx.c ?創建.c源文件
? ? 2、編寫代碼,并保存退出
? ? 3、gcc xxx.c ?編譯.c源文件,成功會得到a.out可執行文件
? ? 4、./a.out ?運行可執行文件
? ? ? ? 注意:可以合并3、4
? ? ? ? ? ? gcc xxx.c && ./a.out
? ? #include <stdio.h>
? ? ? ? 程序員所編寫的代碼不是標準C代碼,需要一段程序把它翻譯成標準C代碼,負責翻譯的程序叫做預處理器,翻譯的過程叫做預處理,需要被翻譯的代碼叫做預處理指令,以#開頭的代碼叫做預處理指令
? ? ? ? #include 功能是導入頭文件
? ? ? ? ? ? #include <xxx.h>
? ? ? ? ? ? ? ? <> 從系統指定路徑查找頭文件并導入
? ? ? ? ? ? #include "xxx.h"
? ? ? ? ? ? ? ? "" 先從當前的工作路徑查找頭文件,如果找不到再從系統指定路徑查找并導入
? ? ? ? stdio.h?
? ? ? ? ? ? 頭文件:以.h結尾,里面存放的是輔助性代碼,絕大多數都是函數的說明
? ? int main()
? ? {
? ? ? ? printf("Hello World!\n");
? ? ? ? return 0;
? ? }
? ? main函數:
? ? ? ? C語言以函數為單位管理代碼,一個函數就是一段具有某一項功能的代碼段
? ? ? ? main函數是程序的執行入口,必須有且只能有一個
? ? ? ? int 是一種數據類型,它表示main函數的執行結果是一個整數
? ? ? ? return 功能有兩個:
? ? ? ? ? ? 1、結束函數的執行
? ? ? ? ? ? 2、返回一個結果給函數的調用者?
? ? ? ? main函數的調用者是操作系統,它的返回值是給了操作系統的,它的值能反應出程序是如何結束的,一般有三類:
? ? ? ? ? ? 正數 ? ?出現異常 ? ?(別人的錯誤)
? ? ? ? ? ? 0 ? ? ? 一切正常
? ? ? ? ? ? 負數 ? ?出現錯誤 ? ?(自己的錯誤)
? ? ? ??
? ? ? ? printf/scanf ? 是標準庫中的函數,負責輸出數據、輸入數據
? ? ? ? ? ? printf("想要輸出的內容");
? ? ? ? 轉義字符:
? ? ? ? ? ? 鍵盤上一些無法直接打印顯示的符號,用一些特殊的字符組合來表示,這種特殊的字符組合稱為轉義字符,\n 就是其中之一
? ? ? ? ? ? \r ?回到行首
? ? ? ? ? ? \t ?制表符,相當于Tab,用于輸出格式對齊
? ? ? ? ? ? \b ?退格鍵?
? ? ? ? ? ? \a ?鈴響
? ? ? ? ? ? \\ ?表示一個\
? ? ? ? ? ? %% ?表示一個%
? ? ? ??
? ? C語言中以分號作為一行代碼的結束,使用大括號劃分區域
三、編譯器
? ? 負責把人能看得懂的記錄著代碼的文件,翻譯成計算機能看得懂的二進制文件,由預處理器、編譯器、鏈接器組成
? ? gcc是由GNU社區為了編譯Linux內核代碼而開發的一款免費的編譯器 ?
? ? gcc常用的編譯參數:
? ? ? ? -E ?只顯示預處理的結果到終端
? ? ? ? -std=gnu99 ?設置C99語法標準
? ? ? ? -c ?只編譯不鏈接
? ? ? ? -o ?指定編譯結果的名字 -oname -o name
? ? ? ? -S ?生成匯編代碼
? ? ? ? -I ?指定頭文件的加載路徑 -I 加載路徑
? ? ? ? -Wall ? 盡可能多地產生警告
? ? ? ? -Werror 把警告當錯誤處理
? ? ? ? -l ?指定要加載的代碼庫 -lm 使用數學庫
四、C代碼變成可執行文件的詳細過程:
? ? 1、預處理 ? 把源文件翻譯成預處理文件
? ? ? ? gcc -E code.c ? 顯示預處理結果到終端
? ? ? ? gcc -E code.c -o code.i 生成以.i結尾的預處理文件
? ? 2、編譯 ? ? 把預處理文件翻譯成匯編文件
? ? ? ? gcc -S code.i ? 生成以.s結尾的匯編文件
? ? 3、匯編 ? ? 把匯編文件翻譯成二進制的目標文件
? ? ? ? gcc -c code.s ? 生成以.o結尾的目標文件
? ? 4、鏈接 ? ? 把若干個目標文件合并成一個可執行文件
? ? ? ? gcc a.o b.o c.o ... ? 默認生成a.out可執行文件
五、C語言的文件類型:
? ? .c ?源文件
? ? .h ?頭文件
? ? .h.gch ?頭文件的編譯結果文件,它會被優先使用
? ? .i ?預處理文件
? ? .s ?匯編文件
? ? .o ?目標文件
? ? .a ?靜態庫文件
? ? .so 共享庫文件
六、存儲空間的單位:
? ? Bit ?比特 ?一個二進制位,只能存儲0或者1,計算機中存儲數據的最小單位
? ? Byte 字節 ?八個二進制位,計算機存儲器描述存儲容量的基本單位
? ? KB ? 1024字節
? ? MB ? 1024KB
? ? GB ? 1024MB
? ? TB ? 1024GB
? ? PB ? 1024TB
七、數據類型
? ? 為什么要對數據進行分類?
? ? ? ? 1、現實生活中的數據本身就自帶類別屬性
? ? ? ? 2、對數據進行分類可以節約存儲空間、提高運行速度
? ? C語言中數據分類為兩大類:自建(程序員自己設計的類型:結構、聯合、類)和內建(C語言自帶的類型)
? ? ? ? 注意:運算符 sizeof 可以計算類型、變量的字節數
? ? ? ? 整型:
? ? ? ? ? ? signed ?有符號
? ? ? ? ? ? ? ? signed char ? ? 1 ? ? ? -128~127?
? ? ? ? ? ? ? ? signed short ? ?2 ? ? ? -32768~32767
? ? ? ? ? ? ? ? signed int ? ? ?4 ? ? ? 正負20億
? ? ? ? ? ? ? ? signed long ? ? 4/8
? ? ? ? ? ? ? ? signed long long ? 8 ? ?正負9開頭19位整數
? ? ? ? ? ? unsigned 無符號
? ? ? ? ? ? ? ? unsigned char ? ? 1 ? ? ?0~255
? ? ? ? ? ? ? ? unsigned short ? ?2 ? ? ?0~65535
? ? ? ? ? ? ? ? unsigned int ? ? ?4 ? ? ?0~40億
? ? ? ? ? ? ? ? unsigned long ? ? 4/8
? ? ? ? ? ? ? ? unsigned long long ? 8 ? 0~1開頭20位整數
? ? ? ? ? ? 注意:signed不加就代表了加
? ? ? ? ? ? ? ? ? 由于定義無符號整型時比較麻煩,C標準庫把這些類型重定義成一些新的簡單的類型名:
? ? ? ? ? ? ? ? ? ? 需要導入頭文件<stdint.h>
? ? ? ? ? ? ? ? uint8_t uint16_t uint32_t uint64_t
? ? ? ? ? ? ? ? int8_t int16_t int32_t int64_t
? ? ? ? ? ? ? ??
? ? ? ? 浮點型: 有小數部分的類型
? ? ? ? ? ? float ? 單精度 ? ? ?4
? ? ? ? ? ? double ?雙精度 ? ? ?8
? ? ? ? ? ? long double ? ? ? ?12/16
? ? ? ? ? ? 注意:小數點后六位有效
? ? ? ? ? ? 注意:采用一定的算法對真實的浮點型數據到二進制數據進行轉換,這個過程比存儲、讀取整型要慢得多,編程時盡量使用整型數據
? ? double num
? ? if(num < 0.000001 && num > -0.000001)?
? ? ? ? 模擬型:
? ? ? ? ? ? 字符型:char?
? ? ? ? ? ? ? ? 字符就是符號或圖案,在內存中存儲的依然是整數,需要顯示出字符時,會根據ASCII表中對應的關系顯示出對應的字符或圖案
? ? ? ? ? ? ? ? '\0' ? ?0 ? 特殊字符
? ? ? ? ? ? ? ? '0' ? ? 48?
? ? ? ? ? ? ? ? 'A' ? ? 65
? ? ? ? ? ? ? ? 'a' ? ? 97 ?
? ? ? ? ? ? 布爾型:bool
? ? ? ? ? ? ? ? ?先有的C語言后有的bool類型,所以C語言中不可能有真正的布爾類型,在頭文件stdbool.h 中對布爾類型進行了模擬
? ? ? ? ? ? ? ? ? ? bool true false
八、變量與常量
? ? 什么是變量:程序運行期間數值可以發生變化的叫做變量,相當于一個存儲數據的盒子
? ? 定義: ?類型名 變量名;?
? ? ? ? ? ? int num; ?
? ? ? ? ? ? 取名規則:
? ? ? ? ? ? 1、由字母、數字、下劃線組成
? ? ? ? ? ? 2、不能以數字開頭
? ? ? ? ? ? 3、不能與C語言32個關鍵字重名,能默寫
? ? ? ? printf scanf bool true sizeof
? ? ? ? ? ? 4、見名知意 (功能、類型、作用范圍...)
? ??
? ? 使用:
? ? ? ? 賦值: ?變量名 = 10;
? ? ? ? ? ? ? ? num = 10;
? ? ? ? 參與運算: ?2+(變量名*10);
? ? ? ? ? ? ? ? 2+(num*10);
? ? ? ? 注意:C語言中變量的初始值是隨機的,為了安全起見,一般在定義時初始化為0
? ? 變量的輸出與輸入:
? ? ? ? int printf(const char *format, ...);
? ? ? ? 功能:輸出數據
? ? ? ? format:"雙引號包含的提示信息+占位符"
? ? ? ? ...:變量名列表
? ? ? ? 返回值:輸出字符個數
? ? ? ? 類型占位符:C語言中通過類型占位符傳遞變量的類型
? ? ? ? signed char ?short ?int ?long ?long long ? ??
? ? ? ? ? ? ? ? %hhd ?%hd ? %d ? %ld ? %lld
? ? ? ? unsigned char ?short ?int ?long ?long long ?
? ? ? ? ? ? ? ? %hhu ?%hu ? ? %u ? %lu ? %llu
? ? ? ? float ? %f
? ? ? ? double ?%lf
? ? ? ? long double %LF
? ? ? ? 字符型 char %c
?
? ? ? ? int scanf(const char *format, ...);
? ? ? ? 功能:輸入數據
? ? ? ? format:"雙引號包含的占位符"
? ? ? ? ...: ? ?變量地址列表
? ? ? ? 返回值:成功輸入的變量的個數
? ? ? ? 注意:scanf需要提供變量的地址 ?
? ? ? ? ? ? &變量名 == 變量地址
? ??
? ? 什么是常量:程序運行期間數值不能改變的叫做常量
? ? ? ? 100 ? ? 默認int類型
? ? ? ? 100l ? ?long
? ? ? ? 100ll?? ?long long
? ? ? ? 100u ? ?unsigned int
? ? ? ? 100lu ? unsigned long
? ? ? ? 100llu ?unsigned long long
? ? ? ? 3.14 ? ?默認double
? ? ? ? 3.14f ? float
? ? ? ? 3.14l ? long double
九、格式化輸入輸出
? ? %nd ? ?顯示n個字符寬度,不夠則補充空格,右對齊
? ? %-nd ? 顯示n個字符寬度,不夠則補充空格,左對齊
? ? %0nd ? 顯示n個字符寬度,不夠則補充0,右對齊
? ? %n.mf ?顯示n個字符寬度(小數點也算一位),不夠則補充空格,m表示小數點后幾位(四舍五入,不夠補0),右對齊
? ? %g ? ? ?不顯示小數點后多余的0
十、運算符
? ? 自變運算符: ++/-- ? 使變量的值自動加1或者減1
? ? ? ? 前自變:++num/--num 立即生效
? ? ? ? 后自變:num++/num-- 下一行語句才有效
? ? ? ? 注意:不要在一行代碼中多次使用自變運算符
? ? ??
? ? 算術運算符: + - * / %
? ? ? ? 整數/整數 ? 結果還是整數,沒有小數點,只保留整數部分
? ? ? ? ? ? 10/3 ? -> 3
? ? ? ? ? ? 10%3 ? -> 1 ??
? ? ? ? / % 除數不能為0,否則就會浮點數例外、(核心已轉儲),這是個運行報錯,一旦產生程序立即停止,后面不再執行
? ? 關系運算符: > ?< ?>= ?<= ?== ?!=
? ? ? ? 比較結果0(不成立)或1(成立),比較結果可以繼續參與后續的運算
? ? ? ? int n = -100;
? ? ? ? if(10 < n < 100) ? ?
? ? ? ? 結果永遠為真,與數學運算規則不同
? ? ? ? 注意:== 建議常量放左邊
? ? ? ??
? ? 邏輯運算符: ?&& ?|| ?!
? ? ? ? 先把運算對象轉換成邏輯值,0轉換為假,非零轉換真
? ? ? ? A && B ?一假即假
? ? ? ? A || B ?一真即真
? ? ? ? !A ? ? ?求反
? ? ? ? && || 短路特性:
? ? ? ? ? ? 當左邊部分的值可以確定整個表達式的結果時,右邊部分就不執行計算
? ? 三目運算符:運算對象有三個部分
? ? ? ? A ? B : C ??
? ? ? ? 判斷A的值如果為真則執行B,否則執行C
? ? 賦值運算符
? ? ? ? a = 10;?
? ? ? ? a += 10; ? ? ? ?a=a+10;
? ? ? ? a -= 10;
? ? ? ? a *= 10;
? ? ? ? a /= 10;
? ? ? ? a %= 10;
? ? 位運算符: ?& ? | ? ~ ? ^ ?<< ?>>
十一、分支語句 if
? ?
if(表達式); ?//單分支{//表達式為真(非零),則執行此處代碼}if(表達式) ?//雙分支{//表達式為真(非零),則執行此處代碼}else{//表達式為假(零),則執行此處代碼}if(表達式1) ?//多分支{//表達式1為真(非零),則執行此處代碼}else if(表達式2){//表達式2為真,則執行此處代碼}else if(表達式3){//表達式3為真,則執行此處代碼}else{//如果以上所有表達式都為假,則最后執行此處代碼}
十二、分支語句 switch開關分支語句
?
十三、循環語句 for
? ? 循環就是一種讓代碼反復執行的方法,到達你想要效果
? ? for循環是一種非常靈活、變樣多樣且危險(相比其他循環)的循環
? ? for一般使用一個變量來引導循環的執行,該變量叫做循環變量i
?
? ? 大括號問題:
? ? ? ? 1、建議上下對齊
? ? ? ? 2、如果循環體中只有一行代碼,大括號可以省略
? ? ? ? ? ? 但是不利于擴展,一般的商業代碼都要求大括號不能省略
? ? for循環各種寫法:
?
十四、循環語句 while
? ? while(表達式)
? ? {
? ? ? ? // 循環體
? ? }
? ? 當表達式為真時執行循環體,執行完后重新判斷表達式,以此類推,直到表達式為假,結束循環
? ? while相當于for的精簡版本 ? ?for(;表達式;)
? ? for循環專門負責解決明確知道循環次數的問題
? ? while循環專門負責解決不確定循環次數的問題
十五、循環語句 do-while
? ? do{
? ? ? ? // ?循環體
? ? }while(表達式); //表達式為真循環繼續,為假結束循環
? ? 先執行循環體,再判斷循環條件,該循環體至少執行一次
? ? 適合先干活、后檢查的特殊情況,例如輸入密碼、文件內容判斷
? ??
? ? 問:for\while\do-while 區別?
十六、循環嵌套
? ? 循環語句中包含了循環語句
? ? 外層循環執行一次,內存循環執行n次
總結
以上是生活随笔為你收集整理的C语言学习day1、2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Toad 中的compare使用方法
- 下一篇: Win10环境下安装VS2010旗舰版