标准C语言基础知识1
C語言簡介:
? ? BCPL->newB->C語言->UNIX->Minix->Linux->gcc
? ? C語言誕生于1970-1973年,在肯.湯姆遜和丹尼斯.里奇的主導編寫下完成,歸屬于美國的貝爾實驗室。
? ? C語言專門為了編寫操作系統而誕生的語音,所以天生適合硬件編程,以運行速度快著稱,也非常適合實現數據結構與算法。
? ? 由于出現的時間過早,C語音是存在非常多的缺陷,也沒想到普通人也能使用C語音編程,因此就存在陷阱,但是前輩們總結了一些避免的經驗《C語音的陷阱
? ? 與缺陷》C語音三劍客,《C程序設計語言》,C語言的語法很自由,也意味著危險,自由源于自律
? ? C89語法標準,gcc默認的語法標準
? ? C99語法標準,對C89標準的擴展和增強 gcc -std=gnu99/-std=c99(不建議)
? ? C11語法標準,全新的升級
一、第一個C程序
gcc xxx.c
./a.out
#include <stdio.h>
程序員所編寫的代碼并不是標準的C代碼,需要一段程序把它翻譯成標準的C代碼,負責翻譯的程序叫做預處理器,
翻譯的過程叫做預處理。被翻譯的代碼叫做預處理指令,以#號開頭的代碼都是預處理指令
? ? #include 的功能是把一個頭文件導入到當前文件中
? ? #include <> 從系統指定的路徑下加載頭文件
? ? #include "" 先從當前路徑下加載頭文件,如果找不到,再從系統指定的路徑下加載頭文件
? ? 操作系統是通過設置環境變量來指定加載頭文件的路徑
stdio.h
? ? 頭文件:以.h結尾,里面存儲的是一些輔助性的代碼,絕大部分是函數的聲明
? ? 源文件:以.c結尾,里面存儲的是功能性的代碼
? ? C語言標準委員會為C語言以函數的形式提供了一些基礎功能,這些函數就被封裝到了libc.so庫文件中
? ? 用很多頭文件負責對庫中的函數進行分類說明,stdio.h就是其中的一個,常用的還有stdlib.h string.h?
? ? stdio.h 負責對輸入輸出功能的函數進行說明
int main()
{
? ? printf("Hello word!\n");
? ? return 0;
}
main函數:
? ? C語言以函數為單位來管理代碼,是管理代碼的最小單位,一個函數就是一段具有某項功能的代碼段
? ? main函數是程序的執行入口,有且只有一個
? ? int 是一種數據類型,它表示main函數的執行結果是一個整數
? ? return 功能有兩個:1、結束函數的執行 2、返回一個數據給函數的調用者
? ? main函數是由操作系統調用,它的返回值給操作系統的,反映了程序是怎么以結束的,通常有三種情況:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 整數 ? ?出現異常 ? ?(別人的錯誤)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? 一切正常
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 負數 ? ?出現錯誤 ? ?(自己的錯誤)
? ? 可以通過 echo $? 命令查看上一個程序的返回值
? ? printf/scanf 是標準庫中的函數,負責輸入、輸出數據,一般用來調試代碼 printf("---------------\n");
? ? 轉義字符:
? ? ? ? 鍵盤上一些按鍵是沒有符號的,用一些特殊的字符組合來表示,這些特殊字符組合就是轉義字符,\n就是其中一個
? ? ? ? \n 換行
? ? ? ? \b 退一個字符 \b \b
? ? ? ? \r 回到行首
? ? ? ? \t 制表符,用于對齊數據
? ? ? ? \a 鈴響
? ? ? ? \\ 表示一個\
? ? ? ? %% 表示一個%
? ? C語言以分號作為一行代碼的結束,使用大括號劃分代碼區域
二、編譯器
? ? 負責把人能看得懂的記錄了代碼的文本文件,翻譯成計算機能看得懂的二進制文件,由預處理器、編譯器、鏈接器
? ? gcc是由GNU組織為了編譯Linux內核代碼而開發的一款免費、開源的編譯器,默認采用c89標準,-std=gnu99可以設置語法標準
? ? ? ? 常用的參數:
? ? ? ? ? ? -E 顯示預處理的結果
? ? ? ? ? ? -S 生成匯編代碼
? ? ? ? ? ? -c 只編譯不鏈接
? ? ? ? ? ? -o 設置編譯結果的名字
? ? ? ? ? ? -I 指定頭文件的加載路徑
? ? ? ? ? ? -l 指定要使用的庫文件 -lm
? ? ? ? ? ? -Wall ? 以更嚴格的標準來檢查代碼,盡可能多地顯示警告
? ? ? ? ? ? -Werror 把警告當錯誤處理
三、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語言的文件類型:
? ? .h ?頭文件
? ? .h.gch ?頭文件的編譯結果,它會被優先使用
? ? .c ?源文件 ?
? ? .i ?預處理文件
? ? .s ?匯編文件
? ? .o ?目標文件
? ? .a ?靜態庫文件
? ? .so 共享庫文件
四、數據類型
? ? 為什么要對數據進行分類:
? ? ? ? 1、現實社會中的數據就是自帶類別屬性
? ? ? ? 2、對數據進行分類可以節約存儲空間、提高運行效率
? ? 存儲空間的單位:
? ? ? ? Bit 比特 ? ?一個二進制位,只能存儲0或者1,計算機存儲數據的最小單位
? ? ? ? Byte 字節 ? 八個二進制位,計算機存儲數據的基本單位?
? ? ? ? Kb ?1024字節
? ? ? ? Mb ?1024kb
? ? ? ? Gb ?1024Mb
? ? ? ? Tb ?1024Gb
? ? ? ? Pb ?1024Tb
? ? 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位整數
? ? ? ? ? ? ? ? 注意:signed 不加就代表加
? ? ? ? ? ? ? ? 無符號 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位整數
? ? ? ? ? ? ? ? 注意:由于定義無符號數據時比較麻煩,標準庫把這些無符號的類型重新定義成了以下類型:
? ? ? ? ? ? ? ? ? ? 使用時需要包含頭文件:stdint.h
? ? ? ? ? ? ? ? ? ? uint8_t ? ? int8_t ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? uint16_t ? ?int16_t
? ? ? ? ? ? ? ? ? ? uint32_t ? ?int32_t
? ? ? ? ? ? ? ? ? ? uint64_t ? ?int64_t
? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? 浮點型:
? ? ? ? ? ? ? ? float ? ? ? 4 ? ? ??
? ? ? ? ? ? ? ? double ? ? ?8
? ? ? ? ? ? ? ? long double ? ? 12/16
? ? ? ? ? ? ? ? 注意:采用科學計算方法,二進制與真實數據時間需要進行換算,因此浮點型數據耗時要比整形數據多得多,編程時盡量選擇整型
? ? ? ? ? ? ? ? 小數點后六位有效
? ? ? ? ? ? ? ? time ./a.out ? ?計算程序運行時間
? ? ? ? ? ? 模擬型:
? ? ? ? ? ? ? ? 字符型char
? ? ? ? ? ? ? ? ? ? 字符其實就是符號或圖案,內存中存儲的是整數,當需要顯示成字符時會根據ASCII碼表中對應的關系顯示出相應的符號或圖案
? ? ? ? ? ? ? ? ? ? '\0' 0 ? ? ? ?
? ? ? ? ? ? ? ? ? ? '0' 48
? ? ? ? ? ? ? ? ? ? 'A' 65
? ? ? ? ? ? ? ? ? ? 'a' 97
? ? ? ? ? ? ? ? 布爾型bool
? ? ? ? ? ? ? ? ? ? 先有了C語言之后才有了bool類型,所以C語言中是不可能有真正的布爾類型,stdbool.h頭文件對布爾類型進行了模擬
? ? ? ? ? ? ? ? ? ? bool ? ?true ? ?false
五、變量與常量
? ? 什么是變量:程序在運行期間數據可以變化的叫做變量,相當于儲存數據的盒子
? ? 定義:
? ? ? ? 類型 變量名;
? ? ? ? int num;
? ? ? ? 取名規則:
? ? ? ? ? ? 1、由字母、數字、下劃線組成
? ? ? ? ? ? 2、不能以數字開頭
? ? ? ? ? ? 3、不能與32個C語言的關鍵字重名
? ? ? ? ? ? 4、見名知義(功能、類型、范圍...)
? ? ? ??
? ? ? ? 使用:?
? ? ? ? ? ? 賦值: num = 100;
? ? ? ? ? ? 參與運算: num * 10;?
? ? ? ? 注意:變量的默認值是隨機的,為了安全起見要進行初始化,一般初始化為0
? ? ? ? 變量的輸入、輸出:
? ? ? ? ? ? int printf(const char *format, ...);
? ? ? ? ? ? 功能:輸出數據
? ? ? ? ? ? format:"雙引號包含的格式信息(提示信息+占位符)"
? ? ? ? ? ? ...:變量列表
? ? ? ? ? ? 返回值:輸出字符的個數
? ? ? ? ? ? 類型占位符:C語言中通過類型占位符的方式來傳遞變量的類型
? ? ? ? ? ? %hhd %hd %d %ld %lld ? ?有符號
? ? ? ? ? ? %hhu %hu %u %lu %llu ? ?無符號
? ? ? ? ? ? %f %lf %LF ? ? ?
? ? ? ? ? ? %c %s?
? ? ? ? ? ? int scanf(const char *format, ...);
? ? ? ? ? ? 功能:輸入數據
? ? ? ? ? ? format:"雙引號包含的格式信息(占位符)"
? ? ? ? ? ? ...: ? ?變量地址列表 ? ?&變量名
? ? ? ? ? ? 返回值:成功輸入的變量個數
? ? ? ? ? ? 注意:scanf需要的是變量類型、變量地址
? ? ? ? ? ? ? ? 變量地址 = &變量名
總結
以上是生活随笔為你收集整理的标准C语言基础知识1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keep It Mac版(文本笔记工具)
- 下一篇: 《软件测试 第 2 版》读书笔记