暑期自學嵌入式——Day01(C語言階段)

點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!!

主頁:

一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm=1011.2682.3001.5343感悟:

? ? ? ?今天我認為最重要的就是:vim編輯器的快捷指令(使用方法)

目錄

嵌入式開發:文件和目錄相關命令

1.命令pwd

作用

示例

補充說明

2.命令ls

3.命令查看文件內容:cat

4.復制命令:cp命令

5.文件移動命令:mv

6.創建和刪除文件命令:touch和rm

7.創建和刪除目錄命令:mkdir和rm -r

8.vi編輯器的使用(1)

8.1 三種模式:

8.2 插入模式中的常用命令

a/A

i/I

o/O

8.3 便捷命令

9. vim編輯器使用(2)

嵌入式開發基礎知識

編程基礎知識

計算機基本結構

馮諾依曼模型

存儲器的分類

什么是程序

程序的定義

程序從程序員角度看

程序在處理器中的執行過程

程序設計語言的發展

機器語言

匯編語言

高級語言

程序設計步驟

總結

知識小結

數據的表示

計算機數據表示

數值數據的表示

基數與各數位的權

二進制

十六進制

八進制

應用案例

例題:十進制轉二進制

原碼、反碼和補碼

非數值數據表示

ASCII 編碼

編碼分區

編碼細節

總結與思考

知識小結

程序的編譯和調試

gcc 編譯器

實例操作

實戰演練

程序調試

基礎調試宏

調試宏使用示例

實際應用價值

C 語言基礎

程序的基本組成

算法基礎概念

簡單算法實例

代碼實現演示

總結

課程要點回顧

擴展思考

知識小結


嵌入式開發:文件和目錄相關命令

1.命令pwd

pwd 是 Linux 和 Unix 類操作系統中一個非常基礎且常用的命令,它的全稱是 Print Working Directory(打印工作目錄)。

作用

pwd 命令的核心功能是 顯示當前終端會話中你所在的目錄路徑。簡單來說,當你在終端中操作時,通過執行 pwd 可以快速知道自己當前 “身處” 文件系統的哪個位置。

示例

假設你的終端當前處于用戶主目錄下的 Documents/project 文件夾中,輸入 pwd 后,終端會輸出該路徑:

/home/你的用戶名/Documents/project

補充說明

  • 該命令沒有復雜的參數,最常用的就是直接輸入 pwd 并回車。

  • 它常與 cd(切換目錄)、ls(列出目錄內容)等命令配合使用,幫助用戶在文件系統中定位和導航。

  • 在某些特殊場景下,pwd 可能會顯示不同的路徑(如處理符號鏈接時),但默認情況下,它展示的是當前所在目錄的絕對路徑(從根目錄 / 開始的完整路徑)。

總之,pwd 是一個用于 “定位自身位置” 的便捷工具,對于終端操作來說是基礎中的基礎。

2.命令ls

常用的選項是:

ls -l (列舉權限出來)
?
ls -a (將隱藏文件一起列舉出來)
?
ls -R (列舉包含目錄文件的遞歸)

3.命令查看文件內容:cat

cat -s :合并多個空行變成一個空行顯示
cat -b :顯示行號 ? 《 = 》 等效于:nl 文件名

4.復制命令:cp命令

  • 基本語法:

    • cp 源文件 目標路徑:保留原文件名復制

    • cp 源文件 新文件名:復制并重命名

  • 關鍵選項:

    • -i:覆蓋前交互提示(安全防護)

    • -r:遞歸復制目錄及其內容

  • 實用技巧:

    • 支持同時復制多個文件到目錄:cp file1 file2 dir/

    • 路徑表示:

      • 相對路徑:../表示上級目錄

      • 絕對路徑:/home/linux/完整路徑

5.文件移動命令:mv

  • 雙重功能:

    • 移動文件:mv 文件 新路徑

    • 重命名:mv 舊文件名 新文件名

  • 復合操作:

    • 移動+重命名:mv test3.c ../test_three.c

  • 批量操作:

    • 支持同時移動多個文件

  • 注意事項:

    • 與復制命令不同,移動后原位置文件會消失

    • 重命名本質是在同一目錄下的移動操作

6.創建和刪除文件命令:touch和rm

  • touch命令:

    • 創建新文件:touch 新文件名(創建0字節文件)

    • 更新時間戳:對已存在文件使用會更新修改時間

    • 示例:touch a.c創建空C源文件

  • rm命令:

    • 普通文件:rm 文件名

    • 目錄:必須加-r參數遞歸刪除

    安全選項:

    • -i:刪除前確認(建議常備)

  • 危險操作:

    • 不加-r刪除目錄會報錯

    • 無提示刪除可能導致數據丟失

7.創建和刪除目錄命令:mkdir和rm -r

  • mkdir命令:

    • 基本創建:mkdir 目錄名

    • 級聯創建:mkdir -p dir1/dir2(自動創建父目錄)

  • 刪除目錄:

    • 必須使用rm -r 目錄名遞歸刪除

  • 操作驗證:

    • 可用ls -R查看目錄樹結構確認創建結果

8.vi編輯器的使用(1)

8.1 三種模式:

  • 命令行模式: 用戶在用vi編輯文件時最初進入的模式,可以進行復制、粘貼等操作。

  • 插入模式:按“i” 進行文件編輯,按ESC鍵可以回到命令行模式。

  • 底行模式: 光標位于屏幕的底行,可以進行文查找、替換、列出行號等操作。

8.2 插入模式中的常用命令

在 Vim 編輯器中,ai 是進入插入模式的常用命令,用于在文本中插入或添加內容。但它們的具體插入位置有所不同:

a/A
  • a:在當前光標所在位置之后進入插入模式,新輸入內容會接在光標后。比如光標在 “te|st” 的|處(即 “t” 和 “e” 間 ),按a后輸入 “x”,就變成 “texst”。

  • A:直接跳到當前行的行尾,然后進入插入模式,輸入內容追加在行末尾。像行內容是 “hello |world”(| 為光標位置 ),按A輸入 “!” ,就成 “hello world!” 。

i/I
  • i:在當前光標所在位置之前進入插入模式,新內容插在光標前。例如光標在 “t|est” 的|處,按i輸入 “x” ,變為 “txest” 。

  • I:直接跳到當前行的行首,進入插入模式,輸入內容添加在行開頭。若行是 “|hello world”(| 為光標位置 ),按I輸入 “hi” ,就成 “hi hello world” 。

o/O
  • o:在當前光標所在行的下方,新建一行空白行,光標跳到這新行的行首,進入插入模式,方便在下方新增內容。比如當前行是 “第一行”,按o后,下方出現空白行,可直接輸入 “第二行內容” 。

  • O:在當前光標所在行的上方,新建一行空白行,光標移到新行行首進入插入模式,用于在上方插入內容。如當前行是 “第二行”,按O后,上方出現空白行,可輸入 “第一行內容” 。

8.3 便捷命令

  • [N]x:刪除光標位置起的 N 個字符(默認 1 個),刪除內容會存入編輯緩沖區(可理解為 “剪切”,刪的內容能粘貼 )。

  • [N]dd:刪除(剪切)光標所在行起的 N 行內容,存入編輯緩沖區。

  • [N]yy:復制光標所在行起的 N 行內容到編輯緩沖區(“拷貝” 核心命令 )。

  • p/P:從緩沖區取內容粘貼;p 貼在光標后,P 貼在光標前。

  • u:撤銷上一步操作(比如誤刪、誤改時,快速回退 )。

這些是 vi/vim 文本編輯里常用的復制、移動、粘貼、撤銷操作,掌握后能高效處理文本~

這是 vi 編輯器的保存和退出命令說明,各命令功能如下:

命令功能解釋
:q退出未修改的文件;若文件有修改未保存,執行會無效(防止誤關丟失內容)
:q!強制退出,不保存任何修改內容(需謹慎用,避免丟數據)
:w保存文件,但不退出 vi 編輯器(可繼續編輯)
:x等價于 :wq保存文件并退出(文件有修改時保存,無修改時直接退出)
:w File把當前內容另存為指定文件 File(原文件內容不變)
:r File把指定文件 File 的內容讀入 / 插入到當前編輯文件的光標位置

這些是使用 vi/vim 時管理文件保存、退出的核心命令,日常編輯文本經常會用到~

9. vim編輯器使用(2)

快速定位:在命令模式中(使用以下內容)

  • 行定位:

    • 1G: 移動到文件第一行

    • G: 移動到文件最后一行

    • :n: 移動到第n行(如:10到第10行)

    • 行號顯示:

      • :set nu: 顯示行號

      • :set nonu: 隱藏行號

  • vim中的查找:

    基本查找:

    • 查找字符串:

      • /string: 查找指定字符串(如/printf查找printf)

      • n: 向下繼續查找

      • N: 向上繼續查找

    • 正則表達式支持:

      • /^string: 查找以string開頭的行

      • /string$: 查找以string結尾的行

  • Vim中的替換

    基本語法: 冒號開頭表示底行命令,格式為:

    范圍s/舊字符串/新字符串/標志
    • 范圍省略: 當范圍省略時,默認對當前行進行操作

    • 特殊符號:

      • .表示當前行

      • $表示最后一行

      • %表示全文范圍

      • 當前行替換: :s/old/new 僅替換當前行第一個匹配項

        • 指定行范圍:

          • :10,15s/old/new/g 替換10-15行所有匹配項

          • :.,$s/old/new 從當前行到最后一行替換

        • 全文替換:

          • :1,$s/old/new/g 從第一行到最后一行替換

          • :%s/old/new/g 全文替換的簡寫形式

嵌入式開發基礎知識

編程基礎知識

  • 學習目的:掌握計算機基礎知識有助于后續編程時的理解和應用

  • 核心內容:包括計算機基本構成、程序語言發展過程和編程步驟等常識性知識

  • 學習方法:已掌握者可復習鞏固,未掌握者需認真學習這些基礎概念

計算機基本結構

馮諾依曼模型

  • 核心思想:包含硬件構成和存儲程序兩大核心概念

  • 硬件組成:

    • CPU:包含運算器(執行實際運算)和控制器(取指令 / 數據)

    • 存儲器:主要指內存(程序運行時的臨時數據存儲)

    • 輸入設備:如鍵盤、手寫板、串口等

    • 輸出設備:如顯示器、文件、數據庫等

  • 工作方式:計算機通過順序執行存儲器中的程序指令來運行

  • 應用范圍:該模型適用于各類計算設備(PC、手機、開發板等)

存儲器的分類

  • 主存儲器(內存):

    • 功能:存儲待處理數據和運算結果

    • 特點:直接影響系統運行流暢度(如 Windows 需 5-6GB 空閑內存)

    • 實例:內存條(2GB/4GB/8GB/16GB 等規格)

  • 外存儲器:

    • 功能:長期保存數據的大容量存儲

    • 實例:硬盤、U 盤、SD 卡、Flash 等

  • 寄存器:

    • 位置:CPU 內部

    • 特點:訪問速度最快的高速存儲器

    • 功能:直接參與 CPU 運算過程

  • 層級關系:

    1. 外存(硬盤 / Flash)→ 2. 內存 → 3. 寄存器

  • 數據流向:程序文件從外存加載到內存,CPU 通過寄存器處理數據

  • 硬件協作:包含 MMU(內存管理單元)進行地址映射

什么是程序

程序的定義

  • 本質概念:廣義上指為實現特定目標而預先設計的一組可操作工作步驟

  • 英文術語:英文稱為 "program",源自馮?諾依曼計算機體系結構思想

  • 控制作用:計算機通過程序控制硬件組件(輸入 / 輸出設備、運算器、控制器、存儲器)協同工作

程序從程序員角度看

  • 執行文件本質:系統可直接識別的有序二進制指令集合(如 Windows 的.exe,Linux 的可執行文件)

  • 存儲與加載:程序平時存儲在磁盤,執行時加載到內存運行

  • 與源代碼區別:程序員常說的 "C 程序" 指源代碼文件,與最終二進制執行程序存在編譯轉換過程

程序在處理器中的執行過程

  • 硬件組成:包含 CPU 核心、執行單元、內存管理單元 (MMU)、總線接口等組件

  • 地址轉換:程序使用虛擬地址,由 MMU 轉換為物理地址訪問實際內存

  • 學習路徑:后續課程將通過變量、指針等知識點逐步深入講解內存管理機制

程序設計語言的發展

機器語言

  • 編碼形式:直接使用二進制序列表示的機器指令(如 10010101 等)

  • 歷史載體:早期采用紙帶打孔方式存儲程序(60-70 年代主流)

  • 主要缺陷:

    • 與自然語言差異極大,難以記憶和理解

    • 開發維護工作量大、效率低下

    • 完全依賴特定硬件,無法移植

匯編語言

  • 改進原理:用符號表示機器指令(如 MOV 指令操作寄存器和內存)

  • 相對優勢:比機器語言更接近自然語言,降低編程門檻

  • 現存局限:

    • 仍需熟悉硬件架構(如寄存器操作)

    • 平臺依賴性極強(x86 與 ARM 匯編不兼容)

    • 嵌入式開發中主要用于閱讀和局部修改

高級語言

  • 核心特征:

    • 脫離特定計算機系統(如 BASIC、FORTRAN、C/C++ 等)

    • 單條語句對應多條機器指令

    • 采用類自然語言關鍵字(if/else/for 等)

  • 發展脈絡

    • 面向過程(C 語言)→面向對象(C++/Java/C#)

  • 現代趨勢:腳本語言(Python/Shell 等)進一步降低開發難度

  • 嵌入式應用:

    • Linux 內核采用 C 語言編寫

    • 智能硬件開發主要使用 C + 匯編的混合編程模式

  • 行業影響:語言門檻降低推動 IT 行業快速發展,催生移動互聯網、人工智能等新技術浪潮

程序設計步驟

  • 基本流程:編輯→編譯→鏈接→執行→調試的循環過程(SAASE 模型)

  • 工具鏈:

    • 編輯工具:VI 編輯器是核心工具,需要頻繁使用

    • 編譯工具:使用 GCC 編譯器進行編譯

    • 鏈接工具:通過 ld 命令完成鏈接

  • 工作特點:

    • 程序員日常工作就是不斷修改代碼、調試 bug 的循環

    • 需要保持專注和耐心("踏踏實實,心無旁騖")

    • 調試環節尤為重要,被稱為 "bug 終結者" 階段

  • 注意事項:

    • VI 編輯器的重要性:在整個開發過程中需要頻繁使用

    • 開發過程是迭代式的,需要反復修改和測試

總結

  • 核心內容:

    • 計算機基本結構(馮?諾依曼體系)

    • 程序的定義與本質

    • 存儲器的工作原理

    • 程序設計語言發展歷程

    • 程序設計完整步驟

  • 課程特點:

    • 基礎知識覆蓋面廣但較零散

    • 為后續編程實踐奠定理論基礎

  • 重要性:

    • 這些基礎知識是理解編程本質的前提

    • 缺乏這些知識會導致 "不理解每天在做什么"

  • 后續預告:

    • 將逐步增加實際編程訓練量

    • 重點轉向編程、調試、執行等實踐環節

知識小結

知識點核心內容考試重點 / 易混淆點難度系數
計算機基本結構(馮諾依曼模型)計算機硬件構成:輸入 / 輸出設備、運算器、控制器、存儲器(內存 / 外存 / 寄存器);程序控制思想存儲器層級關系(寄存器→內存→外存)與功能區分??
程序定義與本質程序為特定功能設計的操作步驟;實際指二進制可執行文件(如.exe)程序源代碼≠可執行文件(編譯鏈接過程)??
編程語言發展史機器語言(0101)→匯編語言(符號化)→高級語言(面向過程 / 對象)匯編語言平臺依賴性(x86 vs ARM)與高級語言抽象層級???
編程實踐步驟編輯→編譯→調試循環;工具鏈(VI 編輯器 / GCC 編譯器 /ld 鏈接器)調試環節重要性(Bug 修復占開發主要時間)??
存儲系統層級CPU 寄存器→內存→外存(硬盤 / Flash);MMU 虛擬地址映射機制


數據的表示

計算機數據表示

  • 數據分類:計算機處理的數據分為數值型數據(可算術運算,如數字 )和非數值型數據(不可算術運算,如字母、符號、音視頻等 )。

  • 底層原理:所有數據最終都以 0 和 1 的組合形式被計算機處理,包括文字、符號等非數值數據。

數值數據的表示

基數與各數位的權

  • 基數定義:某進制中允許使用的基本數碼個數。十進制基數為 10(數碼 0 - 9 ),八進制基數為 8(數碼 0 - 7 ) 。

  • 位權計算:以基數為底,數字所在位置的序號為指數的整數次冪。例如十進制數中,從右往左數第 n 位(從 0 開始計數 )的位權是 (10^n) 。

二進制

  • 數碼組成:僅包含 0 和 1 兩種數碼,逢 2 進位。

  • 轉換示例:二進制轉十進制,如 (101_2 = 1×2^2 + 0×2^1 + 1×2^0 = 5_{10}) 。

  • 計數規律:二進制數順序如 (0, 1, 10, 11, 100\cdots) ,對應十進制 (0, 1, 2, 3, 4\cdots) 。

十六進制

  • 數碼組成:包含 0 - 9 和 A - F(A 對應 10 ,F 對應 15 )共 16 種數碼,逢 16 進位。

  • 前綴標識:編程中常用 0x 前綴表示十六進制數(如 0x1A )。

  • 轉換關系:1 個十六進制數碼對應 4 位二進制(如 0xF 對應 1111 ),轉換時可直接拆分替換。

八進制

  • 數碼組成:包含 0 - 7 共 8 種數碼,逢 8 進位(如 7 的下一位是 10 )。

  • 前綴標識:通常以數字 0 開頭表示(如 012 表示八進制數 )。

  • 轉換示例:八進制 12 ,計算為 (1×8^1 + 2×8^0 = 10_{10}) (十進制 )。

  • 二進制關系:1 個八進制數碼對應 3 位二進制(如 07 對應 111 )。

應用案例

例題:十進制轉二進制

  • 轉換方法:采用 “除 2 取余,逆序排列” 法。以十進制 25 為例:

    25÷2 = 12 余 1 
    12÷2 = 6 余 0 
    6÷2 = 3 余 0 
    3÷2 = 1 余 1 
    1÷2 = 0 余 1 
  • 結果表示:將余數逆序排列得到 11001

  • 驗證計算:(1×2^4 + 1×2^3 + 0×2^2 + 0×2^1 + 1×2^0 = 25) 。

  • 通用規則:該方法同樣適用于十進制轉八進制、十六進制等其他進制轉換。

原碼、反碼和補碼

  • 正數表示:

    • 規則:正數的原碼、反碼、補碼完全相同。

    • 示例:十進制 5 的三種表示均為 101(8 位表示時為 00000101 )。

  • 負數表示(以 8 位二進制表示 -5 為例):

    • 原碼:符號位 1 表示負,數值部分與正數相同,示例 10000101(最高位 1 為符號位,后 7 位 0000101 表示 5 )。

    • 反碼:符號位不變,數值部分按位取反,示例 11111010

    • 補碼:反碼加 1 ,示例 11111011

  • 符號位規則:最高位為符號位,0 表示正數,1 表示負數。

  • 計算步驟:

    1. 寫出絕對值的二進制表示(原碼)。

    2. 符號位置 1(負數)。

    3. 數值部分取反(反碼)。

    4. 最后加 1(補碼)。

  • 存儲原理:計算機實際存儲和運算使用的是補碼形式。

非數值數據表示

ASCII 編碼

  • 編碼標準:美國國家信息交換標準代碼 (ASCII) ,將字符轉換為二進制編碼形式。

  • 編碼范圍:共 256 個字符(0 - 255 ),對應 1 字節存儲空間(8 位 )。

  • 字符類型:包括文字、符號、圖像、語言和邏輯信息等非數值數據。

編碼分區
  • 控制字符區(00H - 1FH):共 32 個字符,用于通訊或控制,部分字符不可顯示(如 NUL、SOH 等控制符 )。

  • 可顯示字符區(20H - 7FH):共 96 個字符,包含阿拉伯數字、大小寫字母及常見符號,全部可在屏幕上顯示。

  • 擴展字符區(80H - FFH):共 128 個字符,由 IBM 制定,包含框線、音標等非標準字符。

編碼細節
  • 編碼格式:同時顯示八進制、十進制、十六進制和對應字符。

  • 特殊字符:

    • 0:NUL(空字符);7:BEL(響鈴);9:HT(水平制表);10:LF(換行);13:CR(回車) 。

  • 字符轉換原理:每個字符對應唯一整數值(如 'A' = 65 ),計算機實際處理的是該數值的二進制形式,轉換方法為查表獲取十進制值→轉換為二進制。

  • 存儲特性:字符型 (char) 占 1 字節(8 位 ),無符號字符范圍:(0 - 255)(計算公式:最大值 (= 2^8 - 1 = 255) )。

  • '0' 與 0 的區別:字符 '0' 的 ASCII 值為 48(十進制),整數 0 的二進制表示為 00000000 ;計算機處理時,字符 '0' → 48 → 00110000

總結與思考

  • 核心要點:掌握進制轉換方法;理解 ASCII 編碼原理;區分字符與數值的存儲方式。

  • 延伸思考:字符數據通過查表對應整數值表示;字符 '0'(ASCII 48 )與整數 0 本質不同;不同編碼標準(如 Unicode )的區別。

知識小結

知識點核心內容考試重點 / 易混淆點難度系數
編程語言學習規律從數據表示與存儲入手 → 數據類型 / 變量 → 運算符 / 表達式 → 控制語句 → 函數 / 指針 → 面向對象(類)語言共性規律 vs 面向對象特性差異??
計算機數據分類數值型數據(可算術運算) vs 非數值型數據(字符 / 音視頻等)二進制存儲本質與人類十進制習慣差異??
進制系統二進制(基數為 2 )、八進制(基數為 8 )、十進制(基數為 10 )、十六進制(基數為 16 )進制轉換方法(除基取余法)與權值計算???
原碼 / 反碼 / 補碼正數三碼相同;負數符號位固定(1 表示負),反碼取反,補碼 +1補碼的計算機存儲優勢(統一加減法)????
ASCII 編碼表字符與整數的映射標準(如字符 '0' = 48 ),覆蓋 0 - 255 無符號字符范圍字符 '0' 與整數 0 的本質區別(ASCII 值 48 vs 數值 0 )??
進制轉換實操十進制 25 轉二進制:11001(通過連續除 2 取余逆序)高位補零規則(如 8 位二進制表示)???
非數值數據存儲文字 / 符號通過編碼標準(如 ASCII )轉為二進制處理音視頻等復雜數據的非數值特性

程序的編譯和調試

gcc 編譯器

實例操作

  • 基本功能:GCC(GNU Compiler)是 GNU 推出的多平臺編譯器,可將 C、C++ 源程序編譯連接成可執行文件。

  • 支持文件類型:

    • .c:C 語言源代碼

    • .h:程序包含的頭文件

    • .i:已預處理過的 C 源代碼文件

    • .S:匯編語言源代碼文件

    • .o:編譯后的目標文件

  • 編譯語法:

    • 基本格式gcc 源文件 -o 輸出文件名 ,示例 gcc hello.c -o hello

    • 默認輸出:不指定 -o 時生成 a.out 可執行文件。

    • 常用選項:

      • -c:只生成目標文件(.o)而不鏈接 。

      • -g:生成調試信息(用于 gdb 調試) 。

      • -Wall:顯示所有警告信息 。

  • 執行方法:使用 ./可執行文件名 運行程序,如 ./hello

  • 文件管理mkdir 創建目錄;mv 移動文件;rm 刪除文件 。

  • 調試技巧:修改源代碼后必須重新編譯才能生效;建議為每個可執行文件指定不同名稱,避免默認的 a.out 互相覆蓋 。

實戰演練

  • 基礎編譯流程:

    • 使用 vi 編寫源代碼(test.c )。

    • 編譯:gcc test.c -o test -Wall

    • 執行:./test

  • 常見錯誤處理:缺少頭文件(如 stdio.h )會導致警告;語法錯誤會在編譯時顯示具體行號;建議始終使用 -Wall 選項顯示所有警告 。

  • 實戰案例

    (計算 1 + 2 +... + 10 的程序):

    • 源代碼

#include <stdio.h>
int main() {int sum = 0;for (int i = 1; i <= 10; i++) {sum += i;}printf("%d\n", sum);return 0;
}

  • 編譯執行gcc test.c -o test -Wall && ./test

  • 預期輸出55

  • 開發效率技巧Ctrl + Shift + N 打開新終端窗口;Ctrl + Shift + T 在當前窗口新建標簽頁;可在不同窗口同時編輯和編譯代碼 。

程序調試

基礎調試宏

  • 預定義宏__FILE____LINE____FUNCTION__ 是 C 語言頭文件中定義好的調試宏,可直接使用 。

  • 宏功能

    • __FILE__:顯示當前源文件名(如 test.c )。

    • __FUNCTION__:顯示當前函數名(如 main 函數或調用的其他函數 )。

    • __LINE__:顯示當前代碼行號 。

  • 應用場景:在代碼較長時,可用于日志記錄,幫助定位問題發生的具體位置(文件、函數、行號 )。

調試宏使用示例

  • 語法要點:必須使用雙下劃線(__ ),不是單下劃線;宏名稱全部大寫;正確拼寫:__FUNCTION__(注意包含字母 C ) 。

  • 常見錯誤:拼寫錯誤會導致 undeclared identifier 編譯錯誤;參數類型不匹配會觸發格式警告(如用 %s 輸出整型變量 )。

  • 調試過程:編譯器會明確指出錯誤位置和類型;需要檢查宏拼寫和參數對應關系;示例中 m 是整型變量,應與 %d 格式符對應 。

實際應用價值

  • 輸出示例test2.c, main, 9 m=55 表示文件 test2.c 、函數 main 、行號 9 、變量值 55

  • 工程實踐:服務器程序中關鍵操作應記錄日志;通過調試宏可精確定位日志來源;避免日志過長成為流水賬,增加可讀性 。

  • 調試建議:編譯錯誤是正常學習過程;應學會閱讀編譯器錯誤提示;小錯誤(如拼寫、格式)可能產生大量錯誤信息 。

C 語言基礎

程序的基本組成

  • 數據描述:程序中需要明確指定數據的類型和組織形式(數據結構),包括線性結構(如數組、鏈表 )、樹形結構、圖狀結構和集合結構 。

  • 操作描述:即算法,指完成操作的具體步驟,如對數據結構的增刪改查等操作流程 。

算法基礎概念

  • 定義:為解決特定問題而采取的有序步驟集合,強調步驟的完整性和順序性 。

  • 實例說明

    (判斷閏年):

    1. 輸入年份 year

    2. 判斷 year 能否被 4 整除 。

    3. 若能,繼續判斷能否被 100 整除 。

    4. 根據條件分支得出最終結論 。

  • 編程思維培養:通過算法訓練可提升邏輯嚴謹性,培養冷靜分析問題的能力 。

簡單算法實例

  • 階乘計算原始方法:

    • 步驟分解:

      • S1) 計算 1×2

      • S2) 結果 ×3

      • S3) 結果 ×4

      • ...

      • S9) 結果 ×10

    • 局限性:代碼冗長,無法處理大規模數據(如計算 100 的階乘 )。

  • 循環優化算法:

    • 變量設計p 為被乘數(初始值 1 );i 為乘數(初始值 2 ) 。

    • 算法流程:

      1. p = 1

      2. i = 2

      3. p = p × i

      4. i = i + 1

      5. i ≤ 10 則返回步驟 3

    • 優勢:通過循環結構簡化代碼,可輕松擴展計算范圍(如改為 1×100 )。

代碼實現演示

  • 關鍵代碼

#include <stdio.h>
int main() {int p = 1;for (int i = 2; i <= 10; i++) {p *= i;}printf("%d\n", p);return 0;
}
  • 調試技巧:建議復制 test2.ctest3.c 進行修改測試,使用 gcc 編譯時可通過 -o 指定輸出文件名 。

總結

課程要點回顧

  • 工具掌握gcc 編譯器基本使用方法;使用 __FILE____FUNCTION____LINE__ 等宏進行基礎調試 。

  • 核心概念:數據結構與算法的關系;編程邏輯思維的建立方法 。

擴展思考

  • 交叉編譯:在 x86 平臺開發 ARM 程序時,只需將 gcc 替換為 arm - gcc 交叉編譯器,源代碼無需修改 。

  • 學習建議:通過大量編程實踐(建議從 1 加到 100 等基礎算法開始)快速提升編程能力,建立編程思維 。

知識小結

知識點核心內容考試重點 / 易混淆點難度系數
GCC 編譯器基礎介紹GCC 編譯器的基本語法(gcc 源文件 -o 可執行文件 )、默認生成 a.out 、警告選項 -Wall-o 選項的位置靈活性(可置于中間或末尾)??
編譯流程與調試從源代碼到可執行文件的完整流程(預處理→編譯→匯編→鏈接 )未重新編譯導致執行舊版本(需強調修改后必須重新編譯)???
基礎調試技巧使用宏 __FILE____FUNCTION____LINE__ 打印調試信息,輔助定位日志宏拼寫易錯(雙下劃線、大小寫敏感)??
算法與數據結構程序 = 數據結構 + 算法;示例:1 到 10 求和(直接累加 vs 循環優化 )循環邏輯的抽象思維(變量累乘 / 累加的實現差異)????
交叉編譯概念開發板(ARM)與 PC(x86)的代碼移植,需使用 arm - gcc 交叉編譯器代碼無需修改,僅更換編譯器???
編程思維訓練強調邏輯嚴謹性(如閏年判斷的算法步驟)、調試耐心(錯誤量與代碼量無關 )初學者常見誤區(逐行硬編碼 vs 抽象邏輯實現)????

擴展問題

介紹一下gcc編譯的原理

除了gcc,還有哪些常用的C/C++編譯器?

如何在Windows系統中使用命令行工具查看ASCII碼表?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88766.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flutter基礎(前端教程⑧-數據模型)

這個示例展示了如何創建數據模型、解析 JSON 數據&#xff0c;以及在 UI 中使用這些數據&#xff1a;import package:flutter/material.dart; import dart:convert;void main() {// 示例&#xff1a;手動創建User對象final user User(id: 1,name: 張三,age: 25,email: zhangsa…

SSRF10 各種限制繞過之30x跳轉繞過協議限制

ssrf漏洞在廠商的處理下可能進行一些特殊處理導致我們無法直接利用漏洞 有以下四種&#xff1a; 1.ip地址限制繞過 2.域名限制繞過 3.30x跳轉繞過域名限制 4.DNS rebinding繞過內網ip限制 本章我們講30x跳轉繞過域名限制 30x跳轉繞過域名限制 之前我們使用ssrf漏洞時可以…

DNS解析過程和nmap端口掃描

目錄 DNS解析流程&#xff1a; nmap端口掃描 指定掃描方式 TCP全連接掃描 -sT SYN半連接掃描 -sS -sT和 -sS的區別 Linux提權 利用好谷歌語法查找敏感信息 如果自己搭建了網站文件要放在phpstudy_pro\WWW下。 如果想要使用域名訪問網站&#xff0c;需要在phpstudy_pro…

【基于開源大模型(如deepseek)開發應用及其發展趨勢的一點思考】

1. 開源大模型技術發展現狀1.1 DeepSeek等主流開源大模型的技術特性分析 DeepSeek作為當前最具代表性的開源大模型之一&#xff0c;其技術架構具有多項創新特性。該模型采用混合專家架構(MoE)&#xff0c;通過將視覺編碼分離為"理解"和"生成"兩條路徑&…

java8 ConcurrentHashMap 桶級別鎖實現機制

Java 8 ConcurrentHashMap 桶級別鎖實現機制 Java 8 中的 ConcurrentHashMap 拋棄了分段鎖設計&#xff0c;采用了更細粒度的桶級別鎖&#xff08;bucket-level locking&#xff09;實現&#xff0c;這是其并發性能提升的關鍵。下面詳細解析其實現原理&#xff1a; 1. 基本實現…

Python正則表達式實戰指南

一 正則表達式庫正則表達式是文本處理中不可或缺的強大工具&#xff0c;Python通過re模塊提供了完整的正則表達式支持。本文將詳細介紹re模塊中最常用的match()、search()和findall()函數&#xff0c;以及貪婪模式與非貪婪模式的區別&#xff0c;幫助讀者掌握Python中正則表達式…

使用球體模型模擬相機成像:地面與天空的可見性判斷與紋理映射

在傳統相機模擬中&#xff0c;地面通常被建模為一個平面&#xff08;Plane&#xff09;&#xff0c;這在低空場景下是合理的。但在更大視場范圍或遠距觀察時&#xff0c;地球的曲率不可忽視。因此&#xff0c;我們需要將地面模型從平面升級為球體&#xff0c;并基于球面與光線的…

Agent自動化與代碼智能

核心問題&#xff1a; 現在很多團隊做AI系統有個大毛病&#xff1a;只顧追求“高大上”的新技術&#xff08;尤其是AI Agent&#xff09;&#xff0c;不管實際業務需不需要。 結果系統搞得又貴、又復雜、還容易出錯。大家被“Agent”這個概念搞暈了&#xff1a;到底啥時候用簡單…

SQL141 試卷完成數同比2020年的增長率及排名變化

SQL141 試卷完成數同比2020年的增長率及排名變化 withtemp as (selectexam_id,tag,date(submit_time) as submit_timefromexamination_infoleft join exam_record using (exam_id)wheresubmit_time is not null),2021_temp as (selecttag,count(*) as exam_cnt_21,rank() over…

C語言<數據結構-單鏈表>

鏈表是一種常見且重要的數據結構&#xff0c;在 C 語言中&#xff0c;它通過指針將一系列的節點連接起來&#xff0c;每個節點可以存儲不同類型的數據。相比數組&#xff0c;鏈表在插入和刪除元素時不需要移動大量數據&#xff0c;具有更好的靈活性&#xff0c;尤其適合處理動態…

archive/tar: unknown file mode ?rwxr-xr-x

這個是我在docker build報錯的&#xff0c;這是一個node.js項目。我猜你也是一個node.js下的項目&#xff0c;或者前端項目。 解決方法&#xff1a; .dockerignore里面寫一下node_modules就行了。 未能解決&#xff1a;archive/tar&#xff1a;未知文件模式&#xff1f;rwxr-…

【前端】ikun-markdown: 純js實現markdown到富文本html的轉換庫

文章目錄背景界面當前支持的 Markdown 語法不支持的Markdown 語法代碼節選背景 出于興趣,我使用js實現了一個 markdown語法 -> ast語法樹 -> html富文本的庫, 其速度應當慢于正則實現的同類js庫, 但是語法擴展性更好, 嵌套列表處理起來更方便. 界面 基于此js實現vue組…

【echarts踩坑記錄】為什么第二個Y軸最大值不整潔

目錄問題復現示意圖&#xff1a;解決方法有以下幾種&#xff1a;1. 在y軸配置中手動設置max屬性&#xff1a;2. 使用ECharts提供的坐標軸標簽格式化功能&#xff1a;&#x1f680;寫在最后問題復現示意圖&#xff1a; 今天在用echarts圖表的時候&#xff0c;出現了一個小問題。…

Duplicate cleaner pro 的使用技巧

Duplicate cleaner pro 的使用技巧前言文件去重基本介紹經驗之談目錄結構修改盤符起因方法手動分配方法?數據修改方法安裝sqlite-web修改數據庫GPU加速安裝驅動獲取驅動和硬件信息安裝CUDA配置環境變量&#xff08;如果是自定義安裝&#xff09;創建程序<1>獲取參數和命…

數字孿生技術引領UI前端設計新趨勢:增強現實與虛擬現實的融合應用

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;AR 與 VR 的 “割裂” 與數字孿生的 “融合” 契機增強現實&#xff08;AR&…

Qt使用dump文件記錄并查找軟件奔潰信息詳細教程

Qt使用dump文件記錄并查找軟件奔潰信息一、dump文件概述1、dump文件的基本概念2、dump文件的常見類型3、dump文件的分析工具4、dump文件的應用場景二、具體實現步驟1、下載dbghelp庫2、將庫添加到自己的工程中3、main.cpp添加代碼記錄奔潰日志4、編寫測試代碼5、測試6、結果查看…

UI前端與數字孿生結合案例分享:智慧城市的智慧能源管理系統

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;能源管理的 “數字孿生革命”智慧城市的能源系統正面臨 “供需失衡、損耗…

Android 16系統源碼_SplashScreen窗口的創建流程(一)

一 點擊桌面圖標觸發SplashScreen 1.1 點擊桌面圖標打開應用 點擊桌面的短信圖標&#xff0c;然后打開短信頁面&#xff0c;使用winscope獲取數據。從點擊短信圖標到應用內容完全展開&#xff0c;中間有出現一個標題帶有“Splash Screen”字符串的窗口。 二 Splash Screen窗口創…

線性代數學習筆記

矩陣 矩陣是一種非常重要的數學對象,它通常由一個由數字排成的矩形陣列來定義。一個矩陣由若干行和若干列組成,被稱為矩陣的行數和列數。一般情況下,矩陣的行數和列數分別用 n n n 和 m m m 表示。<

2025.7.13總結

每次寫日記&#xff0c;總覺得自我感受不是很好&#xff0c;腦子總會有許多消極思想。在網上&#xff0c;我曾看到一個關于“人生是一場巨大的事與愿違”&#xff0c;可能&#xff0c;真的是這個樣子吧。以前的我&#xff0c;有上進心&#xff0c;有目標感&#xff0c;腳踏實地…