日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

黑马程序员C语言基础(第三天)

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 黑马程序员C语言基础(第三天) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

黑馬程序員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ǔ)言步驟
      • 注意![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210513165616519.png)
    • 集成開發(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)

  • 優(yōu)點(diǎn)
    • 代碼量小
    • 執(zhí)行速度快
    • 功能強(qiáng)大
    • 編程自由
  • 缺點(diǎn)
    • 寫代碼實(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"); }

    示例:

    #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"); }

    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)去

    #include <stdio.h>int main() {//定義整型變量a, b, cint a;int b;int c;__asm{mov a, 3 //3的值放在a對(duì)應(yīng)內(nèi)存的位置mov b, 4 //4的值放在a對(duì)應(yīng)內(nèi)存的位置mov eax, a //把a(bǔ)內(nèi)存的值放在eax寄存器add eax, b //eax和b相加,結(jié)果放在eaxmov c, eax //eax的值放在c中}printf("%d\n", c);//把c的值輸出return 0;//成功完成 }

    調(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。