黑马程序员C语言基础(第三天)
黑馬程序員C語(yǔ)言基礎(chǔ)(一)第三天
https://www.bilibili.com/video/BV15W411K7k6?p=40
文章目錄
- 低級(jí)語(yǔ)言與高級(jí)語(yǔ)言
- c語(yǔ)言優(yōu)缺點(diǎn)
- c語(yǔ)言應(yīng)用領(lǐng)域
- 通過gcc編譯C代碼
- gcc編譯器介紹
- Linux平臺(tái)下編譯代碼
- Windows平臺(tái)下gcc環(huán)境配置(略)
- 注意事項(xiàng)
- C語(yǔ)言代碼分析
- include頭文件包含
- main函數(shù)
- {} 括號(hào),程序體和代碼塊
- 注釋
- printf函數(shù)
- return語(yǔ)句
- system函數(shù)
- system函數(shù)的使用
- system返回值,不同系統(tǒng)結(jié)果不一樣(POSIX標(biāo)準(zhǔn)?保證結(jié)果一致?所以最好不要在不同系統(tǒng)間導(dǎo)來導(dǎo)去?)
- Qt圖形界面調(diào)用system
- MFC圖形界面調(diào)用system
- C語(yǔ)言編譯過程
- C程序編譯步驟
- 1)預(yù)處理:宏定義展開、頭文件展開、條件編譯等,同時(shí)將代碼中的注釋刪除,這里并不會(huì)檢查語(yǔ)法
- 2)編譯:檢查語(yǔ)法,將預(yù)處理后文件編譯生成匯編文件
- 3)匯編:將匯編文件生成目標(biāo)文件(二進(jìn)制文件)
- 4)鏈接:C語(yǔ)言寫的程序是需要依賴各種庫(kù)的,所以編譯之后還需要把庫(kù)鏈接到最終的可執(zhí)行程序中去
- gcc編譯過程
- 1) 分步編譯
- 一步編譯
- 查找程序所依賴的動(dòng)態(tài)庫(kù)(ldd)(depends.exe軟件)
- CPU內(nèi)部結(jié)構(gòu)與寄存器(了解)(略)
- 64位和32位系統(tǒng)區(qū)別
- 寄存器、緩存、內(nèi)存三者關(guān)系
- 匯編語(yǔ)言(略)
- visual studio寫c語(yǔ)言步驟(查看反匯編代碼)
- Qt creator寫c語(yǔ)言步驟
- 注意
- 集成開發(fā)環(huán)境IDE
- Qt Creator
- Microsoft Visual Studio
- 1) VS常用快捷鍵
- 2) VS2013的C4996錯(cuò)誤
好多,挑重點(diǎn)
低級(jí)語(yǔ)言與高級(jí)語(yǔ)言
c語(yǔ)言優(yōu)缺點(diǎn)
語(yǔ)言特點(diǎn)
- 代碼量小
- 執(zhí)行速度快
- 功能強(qiáng)大
- 編程自由
- 寫代碼實(shí)現(xiàn)周期長(zhǎng)
- 可移植性較差
- 過于自由,經(jīng)驗(yàn)不足易出錯(cuò)
- 對(duì)平臺(tái)庫(kù)依賴較多
c語(yǔ)言應(yīng)用領(lǐng)域
- C語(yǔ)言可以寫網(wǎng)站后臺(tái)程序
- C語(yǔ)言可以專門針對(duì)某個(gè)主題寫出功能強(qiáng)大的程序庫(kù)
- C語(yǔ)言可以寫出大型游戲的引擎
- C語(yǔ)言可以寫出另一個(gè)語(yǔ)言來
- C語(yǔ)言可以寫操作系統(tǒng)和驅(qū)動(dòng)程序,并且只能用C語(yǔ)言編寫
- 任何設(shè)備只要配置了微處理器,就都支持C語(yǔ)言。從微波爐到手機(jī),都是由C語(yǔ)言技術(shù)來推動(dòng)的
通過gcc編譯C代碼
gcc編譯器介紹
編輯器(如vi、記事本)是指我用它來寫程序的(編輯代碼),而我們寫的代碼語(yǔ)句,電腦是不懂的,我們需要把它轉(zhuǎn)成電腦能懂的語(yǔ)句,編譯器就是這樣的轉(zhuǎn)化工具。就是說,我們用編輯器編寫程序,由編譯器編譯后才可以運(yùn)行!
編譯器是將易于編寫、閱讀和維護(hù)的高級(jí)計(jì)算機(jī)語(yǔ)言翻譯為計(jì)算機(jī)能解讀、運(yùn)行的低級(jí)機(jī)器語(yǔ)言的程序。
gcc(GNU Compiler Collection,GNU 編譯器套件),是由 GNU 開發(fā)的編程語(yǔ)言編譯器。gcc原本作為GNU操作系統(tǒng)的官方編譯器,現(xiàn)已被大多數(shù)類Unix操作系統(tǒng)(如Linux、BSD、Mac OS X等)采納為標(biāo)準(zhǔn)的編譯器,gcc同樣適用于微軟的Windows。
gcc最初用于編譯C語(yǔ)言,隨著項(xiàng)目的發(fā)展gcc已經(jīng)成為了能夠編譯C、C++、Java、Ada、fortran、Object C、Object C++、Go語(yǔ)言的編譯器大家族。
編譯命令格式:
gcc [-option1] ... <filename> g++ [-option1] ... <filename>- 命令、選項(xiàng)和源文件之間使用空格分隔
- 一行命令中可以有零個(gè)、一個(gè)或多個(gè)選項(xiàng)
- 文件名可以包含文件的絕對(duì)路徑,也可以使用相對(duì)路徑
- 如果命令中不包含輸出可執(zhí)行文件的文件名,可執(zhí)行文件的文件名會(huì)自動(dòng)生成一個(gè)默認(rèn)名,Linux平臺(tái)為a.out,Windows平臺(tái)為a.exe
gcc、g++編譯常用選項(xiàng)說明:
示例:
Linux平臺(tái)下編譯代碼
- gcc warning的意思是警告,是有問題,但不影響編譯
- error是錯(cuò)誤,如果遇到error,那么就不能編譯了
Windows平臺(tái)下gcc環(huán)境配置(略)
windows怎么用qt MinGW gcc編譯c代碼
注意事項(xiàng)
Linux編譯后的可執(zhí)行程序只能在Linux運(yùn)行,Windows編譯后的程序只能在Windows下運(yùn)行。
64位的Linux編譯后的程序只能在64位Linux下運(yùn)行,32位Linux編譯后的程序只能在32位的Linux運(yùn)行。
64位的Windows編譯后的程序只能在64位Windows下運(yùn)行,32位Windows編譯后的程序可以在64位的Windows運(yùn)行。
C語(yǔ)言代碼分析
include頭文件包含
- #include的意思是頭文件包含,#include <stdio.h>代表包含stdio.h這個(gè)頭文件
- 使用C語(yǔ)言庫(kù)函數(shù)需要提前包含庫(kù)函數(shù)對(duì)應(yīng)的頭文件,如這里使用了printf()函數(shù),需要包含stdio.h頭文件
- 可以通過man 3 printf查看printf所需的頭文件
#include< > 與 #include ""的區(qū)別:
- < > 表示系統(tǒng)直接按系統(tǒng)指定的目錄檢索
- "" 表示系統(tǒng)先在 “” 指定的路徑(沒寫路徑代表當(dāng)前路徑)查找頭文件,如果找不到,再按系統(tǒng)指定的目錄檢索
stdio.h是在操作系統(tǒng)的系統(tǒng)目錄下:
main函數(shù)
- 一個(gè)完整的C語(yǔ)言程序,是由一個(gè)、且只能有一個(gè)main()函數(shù)(又稱主函數(shù),必須有)和若干個(gè)其他函數(shù)結(jié)合而成(可選)。
- main函數(shù)是C語(yǔ)言程序的入口,程序是從main函數(shù)開始執(zhí)行。
{} 括號(hào),程序體和代碼塊
- {}叫代碼塊,一個(gè)代碼塊內(nèi)部可以有一條或者多條語(yǔ)句
- C語(yǔ)言每句可執(zhí)行代碼都是";"分號(hào)結(jié)尾
- 所有的#開頭的行,都代表預(yù)編譯指令,預(yù)編譯指令行結(jié)尾是沒有分號(hào)的
- 所有的可執(zhí)行語(yǔ)句必須是在代碼塊里面
注釋
- //叫行注釋,注釋的內(nèi)容編譯器是忽略的,注釋主要的作用是在代碼中加一些說明和解釋,這樣有利于代碼的閱讀
- /**/叫塊注釋
- 塊注釋是C語(yǔ)言標(biāo)準(zhǔn)的注釋方法
- 行注釋是從C++語(yǔ)言借鑒過來的
printf函數(shù)
- printf是C語(yǔ)言庫(kù)函數(shù),功能是向標(biāo)準(zhǔn)輸出設(shè)備輸出一個(gè)字符串
- printf(“hello world\n”); ,\n的意思是回車換行
return語(yǔ)句
- return代表函數(shù)執(zhí)行完畢,返回return代表函數(shù)的終止
- 如果main定義的時(shí)候前面是int,那么return后面就需要寫一個(gè)整數(shù);如果main定義的時(shí)候前面是void,那么return后面什么也不需要寫
- 在main函數(shù)中return 0代表程序執(zhí)行成功,return -1代表程序執(zhí)行失敗
- int main()和void main()在C語(yǔ)言中是一樣的,但C++只接受int main這種定義方式
system函數(shù)
system函數(shù)的使用
#include <stdlib.h> int system(const char *command);功能:在已經(jīng)運(yùn)行的程序中執(zhí)行另外一個(gè)外部程序
參數(shù):外部可執(zhí)行程序名字
返回值:
成功:不同系統(tǒng)返回值不一樣
失敗:通常是 - 1
示例代碼:
#include <stdio.h> #include <stdlib.h>int main() {//system("calc"); //windows平臺(tái)system("ls"); //Linux平臺(tái), 需要頭文件#include <stdlib.h>return 0; }示例:
02_system.c
#include <stdio.h> #include <stdlib.h> int main() {system("ls");printf("下雨了!\n");return 0; }system返回值,不同系統(tǒng)結(jié)果不一樣(POSIX標(biāo)準(zhǔn)?保證結(jié)果一致?所以最好不要在不同系統(tǒng)間導(dǎo)來導(dǎo)去?)
C語(yǔ)言所有的庫(kù)函數(shù)調(diào)用,只能保證語(yǔ)法是一致的,但不能保證執(zhí)行結(jié)果是一致的,同樣的庫(kù)函數(shù)在不同的操作系統(tǒng)下執(zhí)行結(jié)果可能是一樣的,也可能是不一樣的。
在學(xué)習(xí)Linux發(fā)展史時(shí),我們得知Linux的發(fā)展離不開POSIX標(biāo)準(zhǔn),只要符合這個(gè)標(biāo)準(zhǔn)的函數(shù),在不同的系統(tǒng)下執(zhí)行的結(jié)果就可以一致。
Unix和linux很多庫(kù)函數(shù)都是支持POSIX的,但Windows支持的比較差。
如果將Unix代碼移植到Linux一般代價(jià)很小,如果把Windows代碼移植到Unix或者Linux就比較麻煩。
Qt圖形界面調(diào)用system
void Widget::on_pushButton_clicked() {//system("calc"); //需要頭文件:#include <stdlib.h>WinExec("calc", SW_NORMAL); //需要頭文件:#include <windows.h> }void Widget::on_pushButton_2_clicked() {system("notepad"); }void Widget::on_pushButton_3_clicked() {system("mmc"); }示例:
MFC圖形界面調(diào)用system
#include "mainwindow.h" #include "./ui_mainwindow.h" #include "stdio.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWindow() {delete ui; }void MainWindow::on_pushButton_clicked() {//打開計(jì)算器system("calc"); }void MainWindow::on_pushButton_2_clicked() { //打開記事本system("notepad"); }C語(yǔ)言編譯過程
C程序編譯步驟
C代碼編譯成可執(zhí)行程序經(jīng)過4步:
1)預(yù)處理:宏定義展開、頭文件展開、條件編譯等,同時(shí)將代碼中的注釋刪除,這里并不會(huì)檢查語(yǔ)法
2)編譯:檢查語(yǔ)法,將預(yù)處理后文件編譯生成匯編文件
3)匯編:將匯編文件生成目標(biāo)文件(二進(jìn)制文件)
4)鏈接:C語(yǔ)言寫的程序是需要依賴各種庫(kù)的,所以編譯之后還需要把庫(kù)鏈接到最終的可執(zhí)行程序中去
gcc編譯過程
1) 分步編譯
預(yù)處理:gcc -E hello.c -o hello.i 編 譯:gcc -S hello.i -o hello.s 匯 編:gcc -c hello.s -o hello.o 鏈 接:gcc hello.o -o hello_elf
一步編譯
gcc hello.c -o demo(還是經(jīng)過:預(yù)處理、編譯、匯編、鏈接的過程):
查找程序所依賴的動(dòng)態(tài)庫(kù)(ldd)(depends.exe軟件)
1)Linux平臺(tái)下,ldd(“l(fā)”為字母) 可執(zhí)行程序:
2)Windows平臺(tái)下,需要相應(yīng)軟件(Depends.exe):
CPU內(nèi)部結(jié)構(gòu)與寄存器(了解)(略)
64位和32位系統(tǒng)區(qū)別
- 寄存器是CPU內(nèi)部最基本的存儲(chǔ)單元
- CPU對(duì)外是通過總線(地址、控制、數(shù)據(jù))來和外部設(shè)備交互的,總線的寬度是8位,同時(shí)CPU的寄存器也是8位,那么這個(gè)CPU就叫8位CPU
- 如果總線是32位,寄存器也是32位的,那么這個(gè)CPU就是32位CPU
- 有一種CPU內(nèi)部的寄存器是32位的,但總線是16位,準(zhǔn)32位CPU
- 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以識(shí)別32位的指令
- 在64位的CPU構(gòu)架上運(yùn)行了64位的軟件操作系統(tǒng),那么這個(gè)系統(tǒng)是64位
- 在64位的CPU構(gòu)架上,運(yùn)行了32位的軟件操作系統(tǒng),那么這個(gè)系統(tǒng)就是32位
- 64位的軟件不能運(yùn)行在32位的CPU之上
寄存器、緩存、內(nèi)存三者關(guān)系
按與CPU遠(yuǎn)近來分,離得最近的是寄存器,然后緩存(CPU緩存),最后內(nèi)存。
CPU計(jì)算時(shí),先預(yù)先把要用的數(shù)據(jù)從硬盤讀到內(nèi)存,然后再把即將要用的數(shù)據(jù)讀到寄存器。于是 CPU<—>寄存器<—>內(nèi)存,這就是它們之間的信息交換。
那為什么有緩存呢?因?yàn)槿绻鲜遣僮鲀?nèi)存中的同一址地的數(shù)據(jù),就會(huì)影響速度。于是就在寄存器與內(nèi)存之間設(shè)置一個(gè)緩存。
因?yàn)閺木彺嫣崛〉乃俣冗h(yuǎn)高于內(nèi)存。當(dāng)然緩存的價(jià)格肯定遠(yuǎn)遠(yuǎn)高于內(nèi)存,不然的話,機(jī)器里就沒有內(nèi)存的存在。
由此可以看出,從遠(yuǎn)近來看:CPU〈—〉寄存器〈—> 緩存 <—> 內(nèi)存。
匯編語(yǔ)言(略)
visual studio寫c語(yǔ)言步驟(查看反匯編代碼)
創(chuàng)建新項(xiàng)目–> c++空項(xiàng)目–>
源文件(右鍵)–> 添加 --> 新建項(xiàng)
然后在新建的文件中將代碼粘貼進(jìn)去
調(diào)試 --> 開始執(zhí)行(不調(diào)試)
查看反匯編代碼,在這個(gè)地方打一個(gè)斷點(diǎn)(光標(biāo)移到那行按F9)
按F5開始調(diào)試,然后點(diǎn)開調(diào)試 --> 窗口 --> 反匯編
然后可以看到將匯編代碼反匯編成C的代碼(我怎么看到的是這個(gè),跟老師不一樣啊?)臥槽,是我搞錯(cuò)了,反匯編是看最終生成的機(jī)器語(yǔ)言逆反生成的匯編代碼的0-0
上面修改下代碼就可以了
反匯編(Disassembly):把目標(biāo)代碼轉(zhuǎn)為匯編代碼的過程,也可以說是把機(jī)器語(yǔ)言轉(zhuǎn)換為匯編語(yǔ)言代碼、低級(jí)轉(zhuǎn)高級(jí)的意思
Qt creator寫c語(yǔ)言步驟
歡迎界面點(diǎn)New新建
點(diǎn)擊非Qt項(xiàng)目(Non qt project)點(diǎn)擊純c語(yǔ)言應(yīng)用(plain c application)
與visual studio不同,qt項(xiàng)目路徑和名稱不能有中文字符
將main.c remove發(fā)現(xiàn)按鈕是灰色的
發(fā)現(xiàn)文件被鎖上了
解鎖了還是刪不了,算了不刪了,可能是cmake的問題
點(diǎn)擊新增文件
選擇c/c++源文件
然后在這把文件加到后面就好了
同樣要想刪除main.c只需在cmakelists文件里去掉main.c就好了
然后在里面寫入代碼,
運(yùn)行報(bào)錯(cuò)No executable specified.:
找到項(xiàng)目路徑,把這個(gè)刪除CMakeLists.txt.user
然后發(fā)現(xiàn)還是沒什么用,后來發(fā)現(xiàn)點(diǎn)擊不同地方的run結(jié)果是不同的 ,點(diǎn)擊下面那個(gè)就能運(yùn)行
但是這個(gè)地方還是只有main.c,沒有hello.c,重啟下qt試試?
重啟之后果然就有了,重啟是個(gè)好東西
注意
集成開發(fā)環(huán)境IDE
集成開發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面工具。集成了代碼編寫功能、分析功能、編譯功能、調(diào)試功能等一體化的開發(fā)軟件服務(wù)套。所有具備這一特性的軟件或者軟件套(組)都可以叫集成開發(fā)環(huán)境。
Qt Creator
Qt Creator是跨平臺(tái)的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收購(gòu)后推出的一款新的輕量級(jí)集成開發(fā)環(huán)境(IDE)。此 IDE 能夠跨平臺(tái)運(yùn)行,支持的系統(tǒng)包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根據(jù)官方描述,Qt Creator 的設(shè)計(jì)目標(biāo)是使開發(fā)人員能夠利用 Qt 這個(gè)應(yīng)用程序框架更加快速及輕易的完成開發(fā)任務(wù)。
快捷鍵 含義 Ctrl + i 自動(dòng)格式化代碼 Ctrl + / 注釋/取消注釋 Alt + Enter 自動(dòng)完成類函數(shù)定義 F4 .h 文件和對(duì)應(yīng).cpp 文件切換 F9 設(shè)置斷點(diǎn) F5 調(diào)試運(yùn)行 Ctrl + r 編譯,但不調(diào)試運(yùn)行 Ctrl + b 編譯,不運(yùn)行 F10 next調(diào)試 F11 step調(diào)試Microsoft Visual Studio
Microsoft Visual Studio(簡(jiǎn)稱VS)是美國(guó)微軟公司的開發(fā)工具包系列產(chǎn)品。VS是一個(gè)基本完整的開發(fā)工具集,它包括了整個(gè)軟件生命周期中所需要的大部分工具,如UML工具、代碼管控工具、集成開發(fā)環(huán)境(IDE)等等,所寫的目標(biāo)代碼適用于微軟支持的所有平臺(tái)。Visual Studio是目前最流行的Windows平臺(tái)應(yīng)用程序的集成開發(fā)環(huán)境。
1) VS常用快捷鍵
快捷鍵 含義 Ctrl + k,Ctrl + f 自動(dòng)格式化代碼 Ctrl + k,Ctrl + c 注釋代碼 Ctrl + k,Ctrl + u 取消注釋代碼 F9 設(shè)置斷點(diǎn) F5 調(diào)試運(yùn)行 Ctrl + F5 不調(diào)試運(yùn)行 Ctrl + Shift + b 編譯,不運(yùn)行 F10 next調(diào)試 F11 step調(diào)試2) VS2013的C4996錯(cuò)誤
由于微軟在VS2013中不建議再使用C的傳統(tǒng)庫(kù)函數(shù)scanf,strcpy,sprintf等,所以直接使用這些庫(kù)函數(shù)會(huì)提示C4996錯(cuò)誤:
VS建議采用帶_s的函數(shù),如scanf_s、strcpy_s,但這些并不是標(biāo)準(zhǔn)C函數(shù)。
要想繼續(xù)使用此函數(shù),需要在源文件中添加以下指令就可以避免這個(gè)錯(cuò)誤提示:
#define _CRT_SECURE_NO_WARNINGS //這個(gè)宏定義最好要放到.c文件的第一行 #pragma warning(disable:4996) //或者使用這個(gè)https://www.bilibili.com/video/BV15W411K7k6?p=65&spm_id_from=pageDriver
總結(jié)
以上是生活随笔為你收集整理的黑马程序员C语言基础(第三天)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt creator无法删除文件怎么办?
- 下一篇: 注意区分Mb(Mbps)与MB(mill