在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-24 16:13 ? 次閱讀

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

一、const的用法:

1、const只讀變量:

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

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

const修飾的全局變量在全局數據區分配空間

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

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

2、const全局變量的分歧:

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

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

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

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

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

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

4、const的本質

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

現代c編譯器中的const將具有全局生命周期的變量存儲于只讀存儲區,不是放在全局數據區

注: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)

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

5、const修飾函數參數和返回值

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

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

在c語言中的字符串字面量存儲于只讀存儲區中,在程序中需要使用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的用法

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

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

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

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

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

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

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

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

2、分析原理

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

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

#include <stdio.h>
int main()

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

while(a)



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

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

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

三、總結

const使得變量具有只讀屬性

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

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

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

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

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

    關注

    180

    文章

    7614

    瀏覽量

    137741
  • volatile
    +關注

    關注

    0

    文章

    45

    瀏覽量

    13062
  • CONST
    +關注

    關注

    0

    文章

    45

    瀏覽量

    8189
收藏 人收藏

    評論

    相關推薦

    Triton編譯器支持的編程語言

    編寫和優化深度學習代碼。Python是一種廣泛使用的高級編程語言,具有簡潔易讀、易于上手、庫豐富等特點,非常適合用于深度學習應用的開發。 二
    的頭像 發表于 12-24 17:33 ?463次閱讀

    C語言關鍵字分別發生在哪個階段

    在編譯的第一個階段:預處理,對一些宏定義做替換。 第二個,constC語言中的 const 用于修飾只讀變量,表示變量本身不能修改。 這個關鍵字會在編譯的第二步起作用,也就是編譯。
    的頭像 發表于 11-24 10:31 ?235次閱讀

    NPU支持的編程語言有哪些

    與NPU一起使用: C/C++ : CC++是性能要求較高的應用的首選語言,尤其是在需要直接與硬件交互的場景中。許多NPU硬件都提供了
    的頭像 發表于 11-15 09:21 ?951次閱讀

    C語言指針學習筆記

    本文從底層內存分析,徹底讓讀者明白C語言指針的本質。
    的頭像 發表于 11-05 17:40 ?310次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>指針<b class='flag-5'>學習</b>筆記

    C語言與其他編程語言的比較

    C語言作為一種歷史悠久的編程語言,自其誕生以來,一直在軟件開發領域扮演著重要角色。它以其高效、靈活和可移植性強的特點,成為了系統級編程的首選語言之一。
    的頭像 發表于 10-29 17:30 ?371次閱讀

    GPU深度學習應用案例

    能力,可以顯著提高圖像識別模型的訓練速度和準確性。例如,在人臉識別、自動駕駛等領域,GPU被廣泛應用于加速深度學習模型的訓練和推理過程。 二、自然語言處理 自然語言處理(NLP)是
    的頭像 發表于 10-27 11:13 ?511次閱讀

    FPGA加速深度學習模型的案例

    :DE5Net_Conv_Accelerator 應用場景 :面向深度學習的開源項目,實現了AlexNet的第一層卷積運算加速。 技術特點 : 采用了Verilog語言進行編程,與PCIe接口相集成,可以直接插入到
    的頭像 發表于 10-25 09:22 ?362次閱讀

    利用Matlab函數實現深度學習算法

    在Matlab中實現深度學習算法是一個復雜但強大的過程,可以應用于各種領域,如圖像識別、自然語言處理、時間序列預測等。這里,我將概述一個基本的流程,包括環境設置、數據準備、模型設計、訓練過程、以及測試和評估,并提供一個基于Mat
    的頭像 發表于 07-14 14:21 ?2452次閱讀

    深度學習中的無監督學習方法綜述

    深度學習作為機器學習領域的一個重要分支,近年來在多個領域取得了顯著的成果,特別是在圖像識別、語音識別、自然語言處理等領域。然而,深度
    的頭像 發表于 07-09 10:50 ?954次閱讀

    按照這樣學習C語言,成為卷王不是夢!

    在計算機編程領域,C語言被譽為一種強大而靈活的編程語言,掌握好C語言不僅可以讓你輕松駕馭各種編程任務,還能夠為你的職業生涯打下堅實的基礎。但
    的頭像 發表于 07-06 08:04 ?362次閱讀
    按照這樣<b class='flag-5'>學習</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>,成為卷王不是夢!

    深度學習與nlp的區別在哪

    深度學習和自然語言處理(NLP)是計算機科學領域中兩個非常重要的研究方向。它們之間既有聯系,也有區別。本文將介紹深度學習與NLP的區別。
    的頭像 發表于 07-05 09:47 ?1066次閱讀

    深度學習常用的Python庫

    深度學習作為人工智能的一個重要分支,通過模擬人類大腦中的神經網絡來解決復雜問題。Python作為一種流行的編程語言,憑借其簡潔的語法和豐富的庫支持,成為了深度
    的頭像 發表于 07-03 16:04 ?728次閱讀

    深度學習與卷積神經網絡的應用

    到自然語言處理,深度學習和CNN正逐步改變著我們的生活方式。本文將深入探討深度學習與卷積神經網絡的基本概念、工作原理及其在多個領域的應用,并
    的頭像 發表于 07-02 18:19 ?1054次閱讀

    fpga是用c語言還是verilog

    FPGA(現場可編程邏輯門陣列)開發主要使用的編程語言是硬件描述語言(HDL),其中Verilog是最常用的編程語言之一。而C語言通常用于傳
    的頭像 發表于 03-27 14:38 ?2180次閱讀

    為什么深度學習的效果更好?

    導讀深度學習是機器學習的一個子集,已成為人工智能領域的一項變革性技術,在從計算機視覺、自然語言處理到自動駕駛汽車等廣泛的應用中取得了顯著的成功。深度
    的頭像 發表于 03-09 08:26 ?689次閱讀
    為什么<b class='flag-5'>深度</b><b class='flag-5'>學習</b>的效果更好?
    主站蜘蛛池模板: 午夜三级网 | 久久国产精品久久久久久 | 亚洲色图欧美在线 | 夜夜春宵翁熄性放纵古代 | 一丝不遮视频免费观看 | 午夜影视免费观看 | 1024成人| 日本三区四区免费高清不卡 | 色香蕉在线观看网站 | 天堂资源| 午夜网站免费版在线观看 | 中文字幕在线资源 | 精品久久久久久中文字幕欧美 | 一级免费黄色片 | 又色又爽又黄视频 | 黄视频网站免费看 | www.在线视频 | 欧美一区二区三区性 | 经典三级第一页 | 老司机亚洲精品影院在线 | 偷偷操不一样的久久 | 天天夜夜狠狠一区二区三区 | 国产一级特黄高清免费大片 | 亚洲国产高清精品线久久 | 免费观看的黄色网址 | 男女交黄| 国产一区二区三区乱码 | 中文在线最新版天堂 | 四虎在线永久免费观看 | 色婷婷基地 | 欧美成人eee在线 | 国产成人高清 | 国产成人福利夜色影视 | xxxx69日本| 老子影院午夜精品欧美视频 | 色综合久久五月 | 黄色短视频免费看 | 国产自在自线午夜精品视频在 | 亚洲精品成人在线 | 欧美a色| www.久操|