chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言之const和volatile的深度學(xué)習(xí)

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-24 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

關(guān)于const的用法,現(xiàn)在大概前前后后應(yīng)該寫(xiě)了有兩篇文章,以前學(xué)習(xí)的時(shí)候,用法體會(huì)不是那么深刻,為啥這么說(shuō)呢,因?yàn)樵趯W(xué)習(xí)c++的時(shí)候,會(huì)發(fā)現(xiàn)const關(guān)鍵字有新的玩法,關(guān)于這個(gè)新的玩法,大家可以去看最近學(xué)習(xí)總結(jié)寫(xiě)的c++文章專(zhuān)輯。

一、const的用法:

1、const只讀變量:

const修飾的變量是只讀的,本質(zhì)上還是變量

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

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

const只在編譯期有用,在運(yùn)行期沒(méi)有用

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

2、const全局變量的分歧:

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

標(biāo)準(zhǔn)c語(yǔ)言編譯器不會(huì)將const修飾的全局變量存儲(chǔ)于只讀存儲(chǔ)區(qū)中,而是存儲(chǔ)于可修改的全局?jǐn)?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;

運(yùn)行結(jié)果:

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

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

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

#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;

運(yùn)行結(jié)果:

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

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

(3)const修飾全局變量:

代碼版本一

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



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

輸出結(jié)果:

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;

運(yùn)行結(jié)果:

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

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

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

說(shuō)明:我這個(gè)版本的編譯器支持標(biāo)準(zhǔn)c語(yǔ)言,所以沒(méi)導(dǎo)致程序崩潰,能夠正常運(yùn)行

4、const的本質(zhì)

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

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

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

代碼示例:

#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;

輸出結(jié)果:

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

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

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

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

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

在c語(yǔ)言中的字符串字面量存儲(chǔ)于只讀存儲(chǔ)區(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;

輸出結(jié)果:

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]='_';

注解:上面這樣寫(xiě),肯定有問(wèn)題。

代碼進(jìn)化:

#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;

輸出結(jié)果:

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

二、volatile的用法

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

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

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

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

volatile告訴編譯器必須每次去內(nèi)存中取變量值

volatile主要修飾可能被多個(gè)線程訪問(wèn)的變量

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

volatile可以修飾一個(gè)中斷子程序中會(huì)訪問(wèn)到的非自動(dòng)變量

2、分析原理

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

從字面上來(lái)理解優(yōu)化兩個(gè)字,意思就是最優(yōu)值(變量的值不會(huì)改變),這里我用一個(gè)簡(jiǎn)單代碼來(lái)說(shuō)明一下:

#include <stdio.h>
int main()

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

while(a)



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

當(dāng)然這里為了好理解,我說(shuō)的不是很專(zhuān)業(yè),沒(méi)有從寄存器和內(nèi)存的角度去說(shuō)。(我也不想那么去講解,簡(jiǎn)單理解了就行)

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

三、總結(jié)

const使得變量具有只讀屬性

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

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

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

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

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

    關(guān)注

    183

    文章

    7642

    瀏覽量

    144537
  • volatile
    +關(guān)注

    關(guān)注

    0

    文章

    46

    瀏覽量

    13616
  • CONST
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    什么是??volatile

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

    自動(dòng)駕駛中Transformer大模型會(huì)取代深度學(xué)習(xí)嗎?

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

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    C語(yǔ)言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C語(yǔ)言提供了多種循環(huán)控制語(yǔ)句,如break、continue和
    的頭像 發(fā)表于 04-29 18:49 ?1725次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)控制

    C語(yǔ)言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場(chǎng)景

    一、基礎(chǔ)概念與核心差異 1.1 結(jié)構(gòu)體(Struct)的本質(zhì) **結(jié)構(gòu)體是C語(yǔ)言中實(shí)現(xiàn)數(shù)據(jù)封裝的基石,其核心特征在于內(nèi)存獨(dú)立性。每個(gè)成員變量在內(nèi)存中按聲明順序依次排列,形成連續(xù)的內(nèi)存塊。以學(xué)生信息為
    發(fā)表于 04-08 09:18

    單片機(jī)編程關(guān)鍵字之volatile

    volatile 修飾的變量是說(shuō)這變量可能會(huì)被意想不到地改變。通常對(duì)于程序員而言,單片機(jī) 中用的就算常見(jiàn)了volatile 是易變的,不穩(wěn)定的意思。其實(shí)對(duì)于很多人來(lái)說(shuō),根本沒(méi)見(jiàn)過(guò)這個(gè)關(guān)鍵字,不 知道
    發(fā)表于 04-02 13:47 ?2次下載

    帶你在單片機(jī)編程中熟練使用const(可下載)

    C 語(yǔ)言關(guān)鍵字中 const 舉足輕重,我們今天就深度聊一聊 const 的定義和實(shí)際應(yīng)用,讓它 不再是迷
    發(fā)表于 04-01 14:18 ?3次下載

    如何在 樹(shù)莓派 上編寫(xiě)和運(yùn)行 C 語(yǔ)言程序?

    在本教程中,我將討論C編程語(yǔ)言是什么,C編程的用途,以及如何在RaspberryPi上編寫(xiě)和運(yùn)行C程序。本文的目的是為您介紹在RaspberryPi上進(jìn)行
    的頭像 發(fā)表于 03-25 09:28 ?931次閱讀
    如何在 樹(shù)莓派 上編寫(xiě)和運(yùn)行 <b class='flag-5'>C</b> <b class='flag-5'>語(yǔ)言</b>程序?

    51單片機(jī)C語(yǔ)言學(xué)習(xí)筆記

    c51語(yǔ)言快速入門(mén)
    發(fā)表于 03-24 14:04 ?3次下載

    為什么學(xué)了C語(yǔ)言,卻寫(xiě)不出像樣的項(xiàng)目?

    學(xué)習(xí)編程的路上,C語(yǔ)言幾乎是每個(gè)程序員的“必修課”。不管你是打算從事嵌入式開(kāi)發(fā)、系統(tǒng)編程,還是想要深入理解操作系統(tǒng)的底層原理,C語(yǔ)言都是一
    的頭像 發(fā)表于 03-14 17:37 ?669次閱讀
    為什么學(xué)了<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>,卻寫(xiě)不出像樣的項(xiàng)目?

    如何排除深度學(xué)習(xí)工作臺(tái)上量化OpenVINO?的特定層?

    無(wú)法確定如何排除要在深度學(xué)習(xí)工作臺(tái)上量化OpenVINO?特定層
    發(fā)表于 03-06 07:31

    軍事應(yīng)用中深度學(xué)習(xí)的挑戰(zhàn)與機(jī)遇

    人工智能尤其是深度學(xué)習(xí)技術(shù)的最新進(jìn)展,加速了不同應(yīng)用領(lǐng)域的創(chuàng)新與發(fā)展。深度學(xué)習(xí)技術(shù)的發(fā)展深刻影響了軍事發(fā)展趨勢(shì),導(dǎo)致戰(zhàn)爭(zhēng)形式和模式發(fā)生重大變化。本文將概述
    的頭像 發(fā)表于 02-14 11:15 ?813次閱讀

    BP神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)的關(guān)系

    BP神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)之間存在著密切的關(guān)系,以下是對(duì)它們之間關(guān)系的介紹: 一、BP神經(jīng)網(wǎng)絡(luò)的基本概念 BP神經(jīng)網(wǎng)絡(luò),即反向傳播神經(jīng)網(wǎng)絡(luò)(Backpropagation Neural Network
    的頭像 發(fā)表于 02-12 15:15 ?1330次閱讀

    const定義的是不是常量

    C語(yǔ)言是如何定義常量的?const定義的算不算是常量? 常見(jiàn)的有這么幾種方式。 首先就是宏定義,使用 define 來(lái)定義。 宏的特點(diǎn)就是在預(yù)處理的時(shí)候被替換,比如這個(gè)地方的 SIZE,預(yù)處理后就會(huì)
    的頭像 發(fā)表于 01-14 11:35 ?636次閱讀

    Triton編譯器支持的編程語(yǔ)言

    編寫(xiě)和優(yōu)化深度學(xué)習(xí)代碼。Python是一種廣泛使用的高級(jí)編程語(yǔ)言,具有簡(jiǎn)潔易讀、易于上手、庫(kù)豐富等特點(diǎn),非常適合用于深度學(xué)習(xí)應(yīng)用的開(kāi)發(fā)。 二
    的頭像 發(fā)表于 12-24 17:33 ?1437次閱讀

    自然語(yǔ)言處理與機(jī)器學(xué)習(xí)的關(guān)系 自然語(yǔ)言處理的基本概念及步驟

    自然語(yǔ)言處理(Natural Language Processing,簡(jiǎn)稱(chēng)NLP)是人工智能和語(yǔ)言學(xué)領(lǐng)域的一個(gè)分支,它致力于研究如何讓計(jì)算機(jī)能夠理解、解釋和生成人類(lèi)語(yǔ)言。機(jī)器學(xué)習(xí)(Ma
    的頭像 發(fā)表于 12-05 15:21 ?2532次閱讀