日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言之const和volatile的深度學習

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-24 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

關于const的用法,現(xiàn)在大概前前后后應該寫了有兩篇文章,以前學習的時候,用法體會不是那么深刻,為啥這么說呢,因為在學習c++的時候,會發(fā)現(xiàn)const關鍵字有新的玩法,關于這個新的玩法,大家可以去看最近學習總結寫的c++文章專輯。

一、const的用法:

1、const只讀變量:

const修飾的變量是只讀的,本質上還是變量

const修飾的局部變量在棧上分配空間

const修飾的全局變量在全局數(shù)據(jù)區(qū)分配空間

const只在編譯期有用,在運行期沒有用

注:const修飾的變量不是真的常量,它只是告訴編譯器該變量不能出現(xiàn)在賦值符號的左邊

2、const全局變量的分歧:

在現(xiàn)代c語言編譯器中,修改const全局變量將導致程序崩潰

標準c語言編譯器不會將const修飾的全局變量存儲于只讀存儲區(qū)中,而是存儲于可修改的全局數(shù)據(jù)區(qū),其值依然可以改變

3、代碼示例:

(1)只讀變量代碼示例:

#include <stdio.h>
int main()

const int a =10;
printf("a = %d",a);
a=20;
printf("a = %d",a);

return 0;

運行結果:

test.c: In function ‘main’:
test.c:8:4: error: assignment of read-only variable ‘a(chǎn)’
a=20;

注解:顯示這個結果很正常,變量a被const修飾了,它就成了只讀的。

(2)如果對變量a的值進行修改:

#include <stdio.h>
int main()

const int a =10;
int *p =(int *) &a;
printf("a = %d",a);
*p=20;
printf("a = %d",a);
return 0;

運行結果:

root@txp-virtual-machine:/home/txp# ./a.out
a = 10
a = 20

注解:通過指針的方式,就能夠把a的值進行修改,這也論證了“const修飾的變量是只讀的,本質上還是變量”這句話

(3)const修飾全局變量:

代碼版本一

#include <stdio.h>
const int b = 40;
int main()



printf("b = %d",b);
b=20;
printf("b = %d",b);
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# gcc test.c
test.c: In function ‘main’:
test.c:10:4: error: assignment of read-only variable ‘b’
b=20;

注解:跟const修飾棧上的變量用法一樣

代碼版本二

#include <stdio.h>
const int b = 40;
int main()

int *p =(int *) &b;
printf("b = %d",b);
*p=20;
printf("b = %d",b);
return 0;

運行結果:

root@txp-virtual-machine:/home/txp# ./a.out
b = 40
Segmentation fault (core dumped)

注解:這里出現(xiàn)了段錯誤,這也驗證了我們上面所說的“修改const全局變量將導致程序崩潰”。

同時為了驗證“標準c語言編譯器不會將const修飾的全局變量存儲于只讀存儲區(qū)中,而是存儲于可修改的全局數(shù)據(jù)區(qū),其值依然可以改變”這句話,我把這段代碼放到dev c++上進行試驗:

說明:我這個版本的編譯器支持標準c語言,所以沒導致程序崩潰,能夠正常運行

4、const的本質

c語言中的const使得變量具有只讀屬性

現(xiàn)代c編譯器中的const將具有全局生命周期的變量存儲于只讀存儲區(qū),不是放在全局數(shù)據(jù)區(qū)

注:const不能定義真正意義上的常量;同時這里注意static關鍵字修飾的變量,它的生命周期和全局變量一樣。

代碼示例:

#include <stdio.h>
const int Array[5] = {0};
void fun(int *p,int v)

*p=v;

int main()

int const i =1;
const static int j =2;
int const array[5] = {0};
fun((int *)&i,1);
fun((int *)&j,2);
fun((int *)&array[2],3);
fun((int *)&Array[1],4);
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# ./a.out
Segmentation fault (core dumped)

注解:這里會有段錯誤,錯誤出現(xiàn)在const+static修飾的j變量對其進行修改,還有const修飾的全局數(shù)組。

5、const修飾函數(shù)參數(shù)和返回值

const修飾函數(shù)參數(shù)表示在函數(shù)體內不希望改變參數(shù)的值

const修飾函數(shù)返回值表示返回值不可改變,多用于返回指針的情形

在c語言中的字符串字面量存儲于只讀存儲區(qū)中,在程序中需要使用const char* 指針,例如:

const char * s = "TXP嵌入式";//字符串字面量

代碼示例:

#include <stdio.h>
const char*fun(const int i)

i=8;
return "TXP";

int main()

const char * p=fun(0);
printf("%s",p);
p[1]='_';
printf("%s",p);
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# gcc test.c
test.c: In function ‘fun’:
test.c:5:4: error: assignment of read-only parameter ‘i’
i=8;

test.c: In function ‘main’:
test.c:12:5: error: assignment of read-only location ‘*(p + 1u)’
p[1]='_';

注解:上面這樣寫,肯定有問題。

代碼進化:

#include <stdio.h>
const char*fun(const int i)

// i=8;
return "TXP";

int main()

const char * p=fun(0);
printf("%s",p);
// p[1]='_';
// printf("%s",p);
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# ./a.out
TXP

二、volatile的用法

老實說,這個關鍵字在面試題目里面經(jīng)常會出現(xiàn),但是平時學習的時候,如果你沒有真正理解這其中的含義,在筆試的時候,腦袋里面可能依稀是記得有那么幾個結論,但是有時候吧,一緊張就把結論給忘了,也不是不可能,所以說,咋們還是老實一點,得真正把它原理搞明白才行,這樣上來戰(zhàn)場就不怕了,以后寫代碼也就少一點bug。

1、volatile的常用結論(volatile英文本意就是易變的意思)

這里我先給結論,然后再給一個例子,把這個例子的講明白,所有結論就都明白了。

volatile可理解為“編譯器警告指示字”

volatile告訴編譯器必須每次去內存中取變量值

volatile主要修飾可能被多個線程訪問的變量

volatile也可以修飾可能被未知因素更改的變量

volatile可以修飾一個中斷子程序中會訪問到的非自動變量

2、分析原理

大家可能平時在博客學習,都會發(fā)現(xiàn)講解編譯器優(yōu)化的,然后加了volatile關鍵來修飾變量,就告訴編譯器不要去優(yōu)化這個變量了,那么這里的優(yōu)化到底是什么意思呢?

從字面上來理解優(yōu)化兩個字,意思就是最優(yōu)值(變量的值不會改變),這里我用一個簡單代碼來說明一下:

#include <stdio.h>
int main()

int a =1;//volatile int a =0;

while(a)



說明:上面的代碼,如果變量a沒有加volatile修飾的話,編譯器就會優(yōu)化它(也就是a的值一直不變),所以while就一直死循環(huán);然后我如果加了volatile來修飾的話,編譯器就不會去優(yōu)化變量a,不優(yōu)化的意思就是說,變量a的值可能就會改變,while就不會一直死循環(huán)。

當然這里為了好理解,我說的不是很專業(yè),沒有從寄存器和內存的角度去說。(我也不想那么去講解,簡單理解了就行)

總之一句話:上面的結論中,volatile修飾的都是變量,變量就可能改變,不會被編譯器優(yōu)化;只是說我們上面的結論應用場景不同而已。

三、總結

const使得變量具有只讀屬性

const不能定義真正意義上的常量

const將具有全局生命周期的變量存儲于只讀存儲區(qū)

volatile強制編譯器減少優(yōu)化,必須每次從內存中取值

好了,今天的分享就到這里,如果文章中有錯誤或者不理解的地方,可以交流互動,一起進步。我是txp,下期見!

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    183

    文章

    7646

    瀏覽量

    146197
  • volatile
    +關注

    關注

    0

    文章

    46

    瀏覽量

    13803
  • CONST
    +關注

    關注

    0

    文章

    45

    瀏覽量

    8824
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C++:const 的空間,常量也能占內存?

    ] != BLACK)): return True return False c++語言5g.FsW.dgdfgsg.cnJIWWQc++語言 c++
    發(fā)表于 04-16 19:19

    自然語言處理NLP的概念和工作原理

    自然語言處理 (NLP) 是人工智能 (AI) 的一個分支,它會教計算機如何理解口頭和書面形式的人類語言。自然語言處理將計算語言學與機器學習
    的頭像 發(fā)表于 01-29 14:01 ?620次閱讀
    自然<b class='flag-5'>語言</b>處理NLP的概念和工作原理

    volatile的修飾符

    volatile完全的重要性。 1)一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。 2); 一個指針可以是volatile 嗎?解釋為什么。 3); 下面的函數(shù)有什
    發(fā)表于 01-06 07:39

    C語言嵌入式系統(tǒng)編程注意事項-內存操作

    程序是非法的:   const int SIZE = 10;  char a[SIZE]; /* 非法:編譯階段不能用到變量 */  關鍵字volaTIle  C語言編譯器會對用戶
    發(fā)表于 01-04 07:31

    請問如何實現(xiàn)C語言訪問MCU寄存器?

    單片機的特殊功能寄存器SFR,是SRAM地址已經(jīng)確定的SRAM單元,在C語言環(huán)境下對其訪問歸納起來有兩種方法。 采用標準C的強制類型轉換和指針來實現(xiàn)   采用標準C的強制轉換和指針的概
    發(fā)表于 12-26 07:00

    關鍵字volatile的含意

    關鍵字volatile有什么含意? 一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心
    發(fā)表于 12-23 06:33

    如何深度學習機器視覺的應用場景

    深度學習視覺應用場景大全 工業(yè)制造領域 復雜缺陷檢測:處理傳統(tǒng)算法難以描述的非標準化缺陷模式 非標產(chǎn)品分類:對形狀、顏色、紋理多變的產(chǎn)品進行智能分類 外觀質量評估:基于學習的外觀質量標準判定 精密
    的頭像 發(fā)表于 11-27 10:19 ?350次閱讀

    什么是??volatile

    volatile是一個類型修飾符(type specifier)。 volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優(yōu)化而省略,且要求每次直接讀值。 volatile變量是說這變量可能會被意想不到地改變,這樣
    發(fā)表于 11-25 06:36

    C語言特性

    ,開發(fā)者們可以在這些社區(qū)中分享經(jīng)驗、交流技術、解決問題。在社區(qū)中,開發(fā)者們可以找到大量的開源項目、代碼示例、技術文章等資源,為學習和使用 C 語言提供了有力的支持。當遇到技術難題時,在社區(qū)中提問往往能得到其他開發(fā)者的熱心幫助,快
    發(fā)表于 11-24 07:01

    C語言和單片機C語言有什么差異

    單片機c語言相對于普通C語言增加了一些基本的指令,還有變量的賦值是16進制,當然單片機c語言只牽
    發(fā)表于 11-14 07:55

    一文了解Mojo編程語言

    Mojo 是一種由 Modular AI 公司開發(fā)的編程語言,旨在將 Python 的易用性與 C 語言的高性能相結合,特別適合人工智能(AI)、高性能計算(HPC)和系統(tǒng)級編程場景。以下是關于
    發(fā)表于 11-07 05:59

    自動駕駛中Transformer大模型會取代深度學習嗎?

    [首發(fā)于智駕最前沿微信公眾號]近年來,隨著ChatGPT、Claude、文心一言等大語言模型在生成文本、對話交互等領域的驚艷表現(xiàn),“Transformer架構是否正在取代傳統(tǒng)深度學習”這一話題一直被
    的頭像 發(fā)表于 08-13 09:15 ?4389次閱讀
    自動駕駛中Transformer大模型會取代<b class='flag-5'>深度</b><b class='flag-5'>學習</b>嗎?

    靈活高效雙引擎驅動:ZBUFF讓C語言內存操作更智能!

    高性能系統(tǒng)。 一、ZBUFF核心庫常用函數(shù) 如果小伙伴們此前沒有接觸過C語言或者不精通C語言,把ZBUFF核心庫當成新庫來學習即可,建議先從
    的頭像 發(fā)表于 08-11 13:27 ?742次閱讀
    靈活高效雙引擎驅動:ZBUFF讓<b class='flag-5'>C</b><b class='flag-5'>語言</b>內存操作更智能!

    深度學習遇上嵌入式資源困境,特征空間如何破局?

    近年來,隨著人工智能(AI)技術的迅猛發(fā)展,深度學習(Deep Learning)成為最熱門的研究領域之一。在語音識別、圖像識別、自然語言處理等領域,深度
    發(fā)表于 07-14 14:50 ?1329次閱讀
    當<b class='flag-5'>深度</b><b class='flag-5'>學習</b>遇上嵌入式資源困境,特征空間如何破局?

    深度操作系統(tǒng)deepin 25全面支持凹語言

    近日,deepin(深度)社區(qū)宣布,deepin 25 現(xiàn)已完成對國產(chǎn)通用編程語言語言 (Wa-Lang) 的兼容性測試。在 deepin 25 默認安裝環(huán)境下,即可直接使用凹語言
    的頭像 發(fā)表于 07-10 15:26 ?1161次閱讀
    <b class='flag-5'>深度</b>操作系統(tǒng)deepin 25全面支持凹<b class='flag-5'>語言</b>
    灯塔市| 特克斯县| 卓资县| 永川市| 大同市| 岑溪市| 龙游县| 饶阳县| 高阳县| 桐柏县| 新丰县| 特克斯县| 呼和浩特市| 南澳县| 旬阳县| 青龙| 科技| 崇左市| 凤庆县| 修水县| 英超| 临夏市| 鸡西市| 民丰县| 枣阳市| 静乐县| 安顺市| 包头市| 淄博市| 南华县| 神木县| 色达县| 长沙市| 荔波县| 宁陕县| 宝丰县| 盐山县| 大新县| 长治市| 保康县| 甘谷县|