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