01-C語言概述

来源:https://www.cnblogs.com/Icer-newer/archive/2023/03/11/17205105.html
-Advertisement-
Play Games

C語言概述 1.什麼是C語言 C語言就是人和電腦交流的一種語言 語言是用來交流溝通的。有一方說,有另一方聽,必須有兩方參與,這是語言最重要的功能: 說的一方傳遞信息,聽的一方接收信息; 說的一方下達指令,聽的一方遵循命令做事情。 語言是人和人交流,C語言是人和機器交流。只是,人可以不聽另外一個人, ...


C語言概述

1.什麼是C語言

C語言就是人和電腦交流的一種語言
語言是用來交流溝通的。有一方說,有另一方聽,必須有兩方參與,這是語言最重要的功能:

  • 說的一方傳遞信息,聽的一方接收信息;
  • 說的一方下達指令,聽的一方遵循命令做事情。

語言是人和人交流,C語言是人和機器交流。只是,人可以不聽另外一個人,但是,電腦是無條件服從。
語言有獨特的語法規則和定義,雙方必須遵循這些規則和定義才能實現真正的交流。
最早的時候使用的是機器語言(01001),後面發展為彙編語言,彙編語言相對於機器語言易懂一些,彙編語言依賴於寄存器,不同的機器可能沒有寄存器。之後出現了高級語言
編譯:將高級語言轉換為電腦能夠識別的二進位指令。

2.C語言特點

2.1優點

  • 代碼量小
  • 執行速度快
  • 功能強大
  • 編程自由

2.2缺點

  • 寫代碼實現周期長
  • 可移植性差
  • 過於自由,經驗不足易出錯
  • 對平臺庫依賴較多

2.3C語言應用領域

C語言的應用極其廣泛,從網站後臺,到底層操作系統,從多媒體應用到大型網路游戲,均可使用C語言來開發:

  • C語言可以寫網站後臺程式
  • C語言可以專門針對某個主題寫出功能強大的程式庫
  • C語言可以寫出大型游戲的引擎
  • C語言可以寫出另一個語言來
  • C語言可以寫操作系統和驅動程式,並且只能用C語言編寫
  • 任何設備只要配置了微處理器,就都支持C語言。從微波爐到手機,都是由C語言技術來推動的

2.4C語言簡潔

C語言僅有32個關鍵字,9種控制語句,34種運算符,卻能完成無數的功能:


3.書寫第一個C語言程式

3.1 Visual Studio基礎使用

  • 使用Visual studio 2019集成開發環境,先創建項目,選擇代碼文件夾
  • 解決方案資源管理器管理代碼
  • 創建的代碼放在項目中,在解決方案資源管理器中的源文件中創建.C文件,源文件右擊-->添加-->新建項-->選擇C++-->更改文件尾碼-->添加


    書寫第一個代碼
// 預處理指令,在預編譯時處理
// #include 包含stdio.h頭文件
// stdio.h頭文件包含了一些函數
// 兩個//表示註釋
// 符號與()結合,代表一個函數
// main() main函數也稱作是主函數,整個程式中有且僅有一個main函數,程式從main函數開始執行
// int代表main函數結束之後的返回值類型,C語言中可以不寫返回值,在C++中必須要寫
// return代表結束這個函數,返回值,返回值的類型和函數定義時的返回值類型一致
// {}裡面的是函數體,所有需要執行的代碼必須寫在{}中
// 每一條代碼必須以分號(;)結尾
// printf是一個庫函數,printf()就是函數調用
#include <stdio.h>   

int main()
{
	printf("Hello world\n");//列印到終端
	printf("Evan zhang");
	return 0;
}
  • 執行代碼,ctrl+F5

3.2 使用文本編輯器編寫代碼

  • C代碼先編譯後執行,首先將C代碼保存,windows命令行界面下,預設是沒有gcc編譯器,我們需要配置一下環境。由於我們安裝了Qt,Qt是一個集成開發環境,內部集成gcc編譯器,配置一下環境變數即可使用gcc。
  • 編譯代碼,安裝Qt之後,在Qt安裝目錄(D:\Qt\Tools\mingw1120_64\bin)下,有gcc.exe是進行編譯代碼的
  • wind+R-->cmd-->打開終端,使用gcc -v查看gcc是否可用,如果找不到就說明沒有配置環境變數
  • 如果想讓電腦能夠執行gcc,比如讓電腦能夠找到gcc--就是配置環境變數(配置環境變數之後要重啟終端)



    windows中的幾個命令
  1. cls 清屏
  2. dir 查看當前文件夾下有哪些文件

編譯代碼

gcc 文件絕對路徑 -o 目標文件


上述方法要寫路徑,比較麻煩,可以在源代碼文件夾下打開cmd,cmd直接切換到該目錄下,這樣就不用添加路徑了

gcc 源文件 -o 編譯文件名
  • 直接使用編譯後的文件進行執行代碼

4.c語言編譯步驟

C代碼編譯成可執行程式經過4步:
1)預處理:巨集定義展開、頭文件展開、條件編譯等,同時將代碼中的註釋刪除,這裡並不會檢查語法
2)編譯:檢查語法,將預處理後文件編譯生成彙編文件
3)彙編:將彙編文件生成目標文件(二進位文件)
4)鏈接:C語言寫的程式是需要依賴各種庫的,所以編譯之後還需要把庫鏈接到最終的可執行程式中去

4.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
選項 含義
-E 只進行預處理
-S(大寫) 只進行預處理和編譯
-c(小寫) 只進行預處理、編譯和彙編
-o file 指定生成的輸出文件名為 file
文件尾碼 含義
.c C 語言文件
.i 預處理後的 C 語言文件
.s 編譯後的彙編文件
.o 編譯後的目標文件

1. 預處理

  • include可以包含任何文件,可以是.h文件,也可以包含.c文件;.h文件是頭文件
#include <stdio.h>
#include <a.c>
  • 註釋在編譯完之後被刪除,註釋有兩種方法,單行註釋//,多行註釋/**/
  • 預處理時會將巨集替換,將巨集用後面的表達式進行替換
  • c語言每條語句都有分號,如果缺失分號,是可以進行預處理的,預處理的時候是不會檢查語法錯誤的
#include <stdio.h>
#define PI 3.14 // #define表示定義一個巨集
int main()
{
	printf("Hello world %lf\n",PI);//列印到終端
	printf("Evan zhang");
	return 0;
}

  • 條件編譯,可以用來註釋,在編譯的時候選擇性的編譯
#include <stdio.h>
#define PI 3.14 // #define表示定義一個巨集
int main()
{
	#if 0   // 不成立,中間內容不進行編譯,#if 1進行編譯
	printf("Hello world %lf\n",PI);//列印到終端
	printf("Evan zhang");
	#endif
	return 0;
}


2. 編譯
將預處理文件編譯成彙編文件(.s文件),編譯會檢查語法錯誤

gcc -S hello.i -o hello.s

3. 彙編
將彙編文件轉換為二進位文件(.o)

gcc -c hello.s -o hello.o

4. 鏈接
二進位文件是執行不了的,需要進行鏈接,鏈接需要設置運行的環境比如堆和棧的空間,還有一些庫文件

gcc    hello.o -o hello


5.system庫函數

作用:在程式中啟動另外一個程式
參數:待啟動程式的路徑名(有些程式在環境變數中能找到,不用加路徑)

#include <stdio.h>
#include <stdlib.h>
int main()
{
	//system啟動程式,如果這個程式系統在環境變數中能找到,不用加路徑
	//如果環境變數中找不到,需要加路徑
	//windows路徑以\\或/進行分割
	//c語言中\表示轉義字元,代表特殊含義
	system("D:\\LXmusic_install\\lx-music-desktop\\lx-music-desktop.exe");
	printf("Hello world\n");//列印到終端
	printf("Evan zhang");
        system("pause");  // pause程式的作用是等待用戶輸入任意按鍵
	return 0;
}

6.CPU內部結構與寄存器(瞭解)

6.1 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之上
  • GPU主要用於運算浮點型數字運算
  • 64位的匯流排也不會訪問到2^64次方的地址
  • 寄存器就是存cpu運算所需要的數據

6.2寄存器名稱

8位 16位 32位 64位
A AX EAX RAX
B BX EBX RBX
C CX ECX RCX
D DX EDX RDX

6.3寄存器\緩存\記憶體之間的關係

按與CPU遠近來分,離得最近的是寄存器,然後緩存(CPU緩存),最後記憶體。

CPU計算時,先預先把要用的數據從硬碟讀到記憶體,然後再把即將要用的數據讀到寄存器。於是 CPU<--->寄存器<--->記憶體,這就是它們之間的信息交換。

那為什麼有緩存呢?因為如果經常操作記憶體中的同一址地的數據,就會影響速度。於是就在寄存器與記憶體之間設置一個緩存。

因為從緩存提取的速度遠高於記憶體。當然緩存的價格肯定遠遠高於記憶體,不然的話,機器里就沒有記憶體的存在。

由此可以看出,從遠近來看:CPU〈---〉寄存器〈---> 緩存 <---> 記憶體。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • VL59 根據RTL圖編寫Verilog程式 這題比較簡單,照著寫就好了。 `timescale 1ns/1ns module RTL( input clk, input rst_n, input data_in, output reg data_out ); reg data_in_reg; al ...
  • 原文鏈接:為什麼 Go 語言 struct 要使用 tags 在 Go 語言中,struct 是一種常見的數據類型,它可以用來表示覆雜的數據結構。在 struct 中,我們可以定義多個欄位,每個欄位可以有不同的類型和名稱。 除了這些基本信息之外,Go 還提供了 struct tags,它可以用來指定 ...
  • 1.全局設置用戶名和郵箱 因為平時除了開發公司項目還會寫自己的項目或者去維護開源項目,一般情況下,公司會要求提交代碼時使用自己的真名或者拼音和公司郵箱,以前就只會設置全局用戶名或郵箱如下 git config --global user.name "username" git config --gl ...
  • 變數和數據類型 所有定義的變數都存在記憶體中,定義變數需要記憶體空間,不同類型的變數需要的記憶體空間是不同的 數據類型作用:告訴編譯器,我這個數據在記憶體中需要多大的空間,編譯器預算對象(變數)分配的記憶體空間大小。 1.常量與變數 1.1 常量 常量:程式運行中不能改變的量 整型常量:1 200 字元常量: ...
  • VS調試以及Qt基本使用 1.彙編語言 1.1 VS中C語言嵌套彙編代碼(瞭解) #include <stdio.h> int main() { //定義整型變數a, b, c int a; int b; int c; __asm { mov a, 3 //3的值放在a對應記憶體的位置 mov b, ...
  • 深夜檔分享,給大家介紹一個黑白的、“驚悚”的網站! 從名字來看(killed by microsoft),是不是猜到點端倪了? 這個神奇的網站居然收錄了微軟壽終正寢的那些軟體。這是一個免費的開放源碼列表,其中列出了已停產的微軟服務、產品、設備和應用程式。網站的目標是成為有關微軟已死項目歷史的真實信息 ...
  • 環境 odoo-14.0.post20221212.tar ORM API學習總結/學習教程 模型(Model) Model欄位被定義為model自身的屬性 from odoo import models, fields class AModel(models.Model): _name = 'a. ...
  • token解決cookie的弊端 cookie的弊端 **弊端一:**瀏覽器請求過伺服器後,下一次訪問時伺服器就會通過瀏覽器cookie中攜帶的sessionID去尋找對應session,但是如果伺服器做了負載均衡,用戶下一次請求可能會被定向到其他伺服器節點,那台伺服器上沒有用戶session信息, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...