單片機之從C語言基礎到專家編程 - 4 C語言基礎 - 4.9 變量與常量

基本數據類型可以作為變量與常量使用,顧名思義,變量運行時可以改變其值,常量運行時不會改變其值。

常量分為整型常量、浮點型常量、字符常量、字符串常量和符號常量。

通常用#define來定義一個標識符來表示一個常量

用type name = 常量來定義一個變量, 變量可以理解成一個容器,可以乘裝不同的常量,也可以理解成計算機為name這個標識符開辟的一個個以字節為單位的小格子,小格子的數量就是變量類型type所占據的存儲空間。每個小格子里的內容依次是當前所裝載的常量數據的字節流

1 整型常量與變量

1)十進制整數

如自然數:

#define CONSTANT_MAX_BUF_LEN_DEC	128
int maxBufLenDec = CONSTANT_MAX_BUF_LEN_DEC;

其中,CONSTANT_MAX_BUF_LEN_DEC為整型常量十進制整數128,maxBufLenDec為變量

2)八進制整數

八進制的數表示為前面帶“0”的數。如

#define CONSTANT_MAX_BUF_LEN_OCT	O200
int maxBufLenOct = CONSTANT_MAX_BUF_LEN_OCT;

其中,CONSTANT_MAX_BUF_LEN_OCT為整型常量八進制整數O200,maxBufLenOct為變量

3)十六進制數

與八進制不同,十六進制整數以“0x”開頭,如:

#define CONSTANT_MAX_BUF_LEN_HEX	0x80
int maxBufLenHex = CONSTANT_MAX_BUF_LEN_HEX;

其中,CONSTANT_MAX_BUF_LEN_HEX為整型常量十六進制整數0x80,maxBufLenHex為變量

4)二進制數

與八進制不同,二進制整數以“0b”開頭,如:

#define CONSTANT_MAX_BUF_LEN_BIN	0b10000000
int maxBufLenBin = CONSTANT_MAX_BUF_LEN_BIN;

其中,CONSTANT_MAX_BUF_LEN_BIN為整型常量二進制整數0b10000000,maxBufLenBin為變量

注意:KEIL編譯器C99并不支持二進制整數的表示與輸出,使用以上代碼編譯時會報錯:expected a “;”

所以,一般我們并不直接使用二進制數作為常量給變量賦值,而是使用十六進制,如果非要考慮使用二進制位來表示數據,可以考慮使用位域,后期會專門講解,此處不做展開。

2 浮點型常量與變量

浮點型常量以“f”結尾

#define CONSTANT_PI		3.141592f
float pi = CONSTANT_PI;

其中,CONSTANT_PI為浮點型常量3.141592f,pi為變量

3 字符常量與變量

用單引號界定起來的一個普通字符或轉義字符,如: ‘a’、‘A’、‘\n‘、'\t’等。
普通字符可以是字符集中任意一個字符。普通字符常量的值就是該字符的ASCII值。
轉義字符是一種特殊的字符常量,以反斜線“\”開頭,后跟一個或幾個字符,主要用來表示那些無法輸出的控制字符或者特殊字符。

轉義字符對照表

轉義字符意義ASCLL碼值(十進制)
\a響鈴(BEL)007
\b退格(BS) ,將當前位置移到前一列008
\f換頁(FF),將當前位置移到下頁開頭012
\n換行(LF) ,將當前位置移到下一行開頭010
\r回車(CR) ,將當前位置移到本行開頭013
\t水平制表(HT) (跳到下一個TAB位置)009
\v垂直制表(VT)011
\’代表一個單引號’039
\"代表一個雙引號字符"034
\\代表一個反斜線字符’\’092
?代表一個問號?063
\0空字符(NUL)000
\ddd1到3位八進制數所代表的任意字符三位八進制
\xhh十六進制所代表的任意字符十六進制
#define CONSTANT_ENTER	'\n'
char word = CONSTANT_ENTER;

其中,CONSTANT_ENTER為字符常量’\n’,word為字符變量。

4 字符串常量與變量

用一對雙引號括起來的一個字符序列,如:“Hello World”、“Master"、“n”、"$1000”等。
存儲:系統自動在字符串常量后面加上“\0”作為字符串結束標志。

#define CONSTANT_HELLO	"Hello World\n"#define CONSTANT_MASTER	"Master"char* words = CONSTANT_HELLO;words = CONSTANT_MASTER;		

其中,CONSTANT_HELLO為字符串常量"Hello World\n",CONSTANT_MASTER為字符串常量"Master"。

使用了char* words定義了字符串變量,其本質是一個字符指針。這里相當與將CONSTANT_HELLO及CONSTANT_MASTER的首地址賦值給字符指針words。

5 符號常量

使用**#define宏定義**,前面所述的用標識符替換各常量的表示就是符號常量。

通常將符號常量放在頭文件中,然后在源文件函數中調用。

6 變量

1)變量的定義和申明

變量的定義:變量必須經過定義才能使用,變量的定義即為變量開辟內存空間,開辟空間的大小即為變量類型所占的大小。變量的值的范圍以變量類型的空間大小和及符號位所決定。同一作用域變量只能定義一次。變量在源文件中定義,永遠不要在頭文件中定義變量。

int a;		//定義一個整型變量a
float b;	//定義一個浮點型變量b
double c; 	//定義一個雙精度型變量c
char d;		//定義一個字符變量d
char* p;	//定義一個字符指針變量p
void test(void)
{int sizeOfA = sizeof(a);		int sizeOfB = sizeof(b);int sizeOfC = sizeof(c);int sizeOfD = sizeof(d);int sizeOfP = sizeof(p);printf("size of a = %d",sizeOfA);		//size of a = 4printf("size of b = %d",sizeOfB);		//size of b = 4printf("size of c = %d",sizeOfC);		//size of c = 8printf("size of d = %d",sizeOfD);		//size of a = 1printf("size of p = %d",sizeOfP);		//size of p = 4
}

?

變量的申明:加上extern關鍵字的變量即為變量聲明,同一作用域變量可聲明多次。變量可在源文件中聲明,也可在頭文件中聲明(用作外部變量)

extern int a;		//申明一個整型變量a
extern float b;	//申明一個浮點型變量b
extern double c; 	//申明一個雙精度型變量c
extern char d;		//申明一個字符變量d
extern char* p;	//申明一個字符指針變量p
2)變量的初始化

變量定義后,還需要初始化,否則其值會得到預期外的結果。

a = 1024;b = 0.001024;c = 0.0000001024;d = '\n';p = "Hello World";
3)變量的使用和賦值

變量初始化后,通過直接調用變量可得到變量的值。

printf("a = %d",a);printf("b = %f",b);printf("c = %lf",c);printf("d = %c",d);printf("p = %s",p);
4)變量的作用范圍

變量在哪里定義的,其作用范圍就在哪里,如果超出這個作用范圍,就會得到變量未定義的錯誤。作用范圍就是{}內部代碼塊的范圍


{int i = 0;}i += 1;// identifier "i" is undefined
5)全局變量與局部變量

在源文件中函數外定義的變量就是全局變量

在函數中定義的變量就是局部變量。

6)靜態變量與動態變量

通過static修飾的變量就是靜態變量

靜態變量用作全局變量時,它在整個當前源文件都是可見的,而在文件之外是不可見的,在頭文件中使用extern聲明會得到變量未定義的錯誤。去掉static修飾,變量用extern就可以訪問了。

靜態變量用作局部變量時,在程序執行到該變量的定義處時被首次初始化,以后的函數調用不再進行初始化;

動態變量在函數中,每次調用函數都會從初始值開始賦值。


int addTest(int i)
{static int sum = 0;sum += i;return sum;}int add(int i)
{int sum = addTest(i);return sum;
}void testAdd()
{int sum = 0;for (int i = 0 ; i < 100 ; i++){sum = add(i + 1);}printf("sum = %d",sum);		//sum = 5050}
7)常變量

變量用const修飾時,就是常變量

常變量指定義時必須顯示初始化且值不可修改的變量。與其他變量一樣被分配空間,是可以尋址的。注意,字符串常量是常變量的一種,名稱為其本身,因為其存儲在靜態存儲區的常量區,可尋址,不可修改。

常變量和常量的區別是:

常量不開辟內存空間。在預編譯時就全部由符號常量的值替換了,?常變量占?內存空間,只是此變量在存在期間不能重新賦值。

常量在計算機運行時,不會被程序修改的量,常變量是在運行時被計算機賦予的值,其值不是唯一的。

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

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

相關文章

無法將“環境變量”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱(pycharm)

無法將“配置的任何一個環境變量”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。 記錄解決“無法將“C:......conda.exe”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱”以及“表達式或語句中包含意外的標記”的系列問題(VSCode開發環境)一、Conda.exe無法正常識…

ROS2 學習(三)話題

話題 節點之間的通信。 叫話題很形象。發布者發布一定數據類型的話題&#xff0c;訂閱者訂閱發布者。 訂閱者發布者不唯一。 異步通信&#xff0c;適用于周期發布的數據而不是邏輯性強的數據。 .msg 格式的消息結構&#xff0c;一種通信接口。 每個話題 topic 有話題名&a…

【Java高級開發高頻面試題】面試者角度的口述版

文章目錄 1.具備扎實的Java基礎集合HashMap底層工作原理HashMap版本問題HashMap并發修改異常HashMap影響HashMap性能的因素HashMap使用優化 SynchronizedThreadLocalAQS線程池JVM內存模型類加載機制與雙親委派垃圾回收算法、垃圾回收器、空間分配擔保策略引用計數器算法、可達性…

創建 Web 內容目錄

創建 Web 內容目錄 按照下方所述&#xff0c;創建一個名為 /home/curtis/ansible/webcontent.yml 的 playbook &#xff1a; 該 playbook 在 dev 主機組中的受管節點上運行 創建符合下列要求的目錄 /webdev &#xff1a; 所有者為 webdev 組 具有常規權限&#xff1a;ownerread…

Nginx反向代理

目錄 一.簡介1.反向代理 二.案例1.案例12.案例2 一.簡介 1.反向代理 1.1反向代理&#xff1a; 是指代理服務器來接收Internet上的客戶端請求&#xff0c;然后將請求轉發給內部網絡上的服務器&#xff0c;并將從服務器上得到的結果返回給客戶端。此時代理服務器對外就表現為一…

循環隊列的實現(c語言)

前言 循環隊列是隊列的一種特殊的結構&#xff0c;在生產者——消費者模型中常常使用它&#xff0c; 它在邏輯上是一個環形的連續的結構。在物理可以使用數組來實現。 目錄 1.循環隊列的邏輯結構 2.空的循環隊列和滿的循環隊列 3.循環隊列插入和刪除 4.代碼實現 …

淺談Redis的maxmemory設置以及淘汰策略

推薦閱讀 AI文本 OCR識別最佳實踐 AI Gamma一鍵生成PPT工具直達鏈接 玩轉cloud Studio 在線編碼神器 玩轉 GPU AI繪畫、AI講話、翻譯,GPU點亮AI想象空間 資源分享 「java、python面試題」來自UC網盤app分享&#xff0c;打開手機app&#xff0c;額外獲得1T空間 https://dr…

音視頻實時通話解決方案

1、問題提出 想要實現音視頻通話,對于大部分人可能會覺得很難,但是實際上,有些事情并沒有大家想的那樣困難,只要功夫深,鐵杵磨成針。 機緣巧合下,在業務中,我也遇到了一個業務場景需要實現音視頻通話,我們不可能自己從零開始干,我本次用到的核心是WebRTC。 2、WebRT…

治療偏頭痛等亞疼痛的遠程電神經調控(REN)設備

原文鏈接&#xff1a; NERIVIO CE標志適應癥擴展到青少年和成人偏頭痛的預防和急性治療 (prnewswire.com) 公司官網&#xff1a; Homepage - Theranica APP下載鏈接&#xff1a; Migraine Headache Treatment - Nerivio 使用過程問題&#xff1a; 常見問題 - 無藥物偏頭痛兩…

統計XML標注文件中各標注類別的標簽數量

目標檢測任務重&#xff0c;擔心數據集中各標簽類別不均衡&#xff0c;想統計XML標注文件中各標注類別的標簽數量&#xff0c;可以使用以下腳本&#xff1a; import os import glob import xml.etree.ElementTree as etdef count_labels(source_dir):file_list glob.glob(os.…

Flink狀態和狀態管理

1.什么是狀態 官方定義&#xff1a;當前計算流程需要依賴到之前計算的結果&#xff0c;那么之前計算的結果就是狀態。 這句話還是挺好理解的&#xff0c;狀態不只存在于Flink&#xff0c;也存在生活的方方面面&#xff0c;比如看到一個認識的人&#xff0c;如何識別認識呢&am…

神經網絡基礎-神經網絡補充概念-24-隨機初始化

由來 在神經網絡的訓練過程中&#xff0c;權重和偏差的初始值對模型的性能和訓練過程的收斂速度都有影響。隨機初始化是一種常用的權重和偏差初始值設置方法&#xff0c;它有助于打破對稱性&#xff0c;避免網絡陷入局部最優解。 概念 當所有權重和偏差都被設置為相同的初始…

Python Web框架:Django、Flask和FastAPI巔峰對決

今天&#xff0c;我們將深入探討Python Web框架的三巨頭&#xff1a;Django、Flask和FastAPI。無論你是Python小白還是老司機&#xff0c;本文都會為你解惑&#xff0c;帶你領略這三者的魅力。廢話不多說&#xff0c;讓我們開始這場終極對比&#xff01; Django&#xff1a;百…

web基礎入門和php語言基礎入門 二

web基礎入門和php語言基礎入門 二 MySQL入門-續MySQL之數據查詢操作MySQL其他知識點 php語言基礎入門認識PHPPHP的工作流程安裝PHP環境認識一個PHP程序PHP基礎知識點進入正題 PHP與WEB交互PHP與MySQL交互總結 MySQL入門-續 MySQL之數據查詢操作 WHERE 子句&#xff0c;條件限…

# 快速評估立功科技基于S32K324的TMS方案

文章目錄 1.前言2.立功科技的TMS方案介紹2.1 介紹資料2.2 簡要介紹 3.S32K3_TriMotor評估板測試3.1 環境搭建S32 Design Studio for S32 Platform 3.4安裝RTD 2.0.0安裝Freemaster 3.2 3.2 例程測試3.3 例程適配3.4 雙核燒錄3.5 測試 1.前言 最近和一些做汽車水泵/風機的客戶交…

算法概述-Java常用算法

算法概述-Java常用算法 1、算法概念2、算法相關概念3、算法的性能評價4、算法應用歸納 1、算法概念 廣泛算法定義&#xff1a;算法是模型分析的一組可行性的、確定的和有窮的規則。 經典算法特征&#xff1a;有窮性、確切性、輸入、輸出和可行性。 常用的算法包括遞推、遞歸、窮…

maven如何建立JavaWeb項目并連接數據庫,驗證登錄

這里是建立建立web項目&#xff1a;Maven如何創建Java web項目&#xff08;純干貨版&#xff09;&#xff01;&#xff01;&#xff01;_明天更新的博客-CSDN博客 我們主要演示如何連接數據庫驗證登錄。 1.在webapp目錄下創建我們的登錄頁面&#xff1a;index.jsp 還需要再…

Android漏洞之戰——整體加殼原理和脫殼技巧詳解

一、前言 為了幫助更加方便的進行漏洞挖掘工作&#xff0c;前面我們通過了幾篇文章詳解的給大家介紹了動態調試技術、過反調試技術、Hook技術、過反Hook技術、抓包技術等&#xff0c;掌握了這些可以很方便的開展App漏洞挖掘工作&#xff0c;而最后我們還需要掌握一定的脫殼技巧…

opencv基礎:幾個常用窗口方法

開始說了一些opencv中的一些常用方法。 namedWindow方法 在OpenCV中&#xff0c;namedWindow函數用于創建一個窗口&#xff0c;并給它指定一個名字。這個函數的基本語法如下&#xff1a; import cv2cv2.namedWindow(窗口名稱, 標識 )窗口名稱&#xff1a;其實窗口名稱&…

Azure創建自定義VM鏡像

創建一個虛擬機&#xff0c;參考 https://blog.csdn.net/m0_48468018/article/details/132267096&#xff0c;入站端口開啟80&#xff0c;22 進行遠程遠程連接 使用CLI命令部署NGINX,輸入如下命令 sudo su apt-get update -y apt-get install nginx git -y最后的效果 4. 關閉…