女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

C語言會同意一些"令人震驚"的結(jié)構(gòu)

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機(jī) ? 2020-09-02 11:32 ? 次閱讀

C語言會同意一些"令人震驚"的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,我們來看看幾個例子。

c = a+++b;

以下代碼是合法的嗎,咋的一看不禁有這樣的疑問?

inta=5,b=7,c; c=a+++b;

這個代碼確實(shí)不咋符合習(xí)慣的寫法,但是不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?

根據(jù)最處理原則,編譯器應(yīng)該能夠盡可能處理所有合法的用法。因此,上面的代碼會被處理成:

c=a+++b;

我們來測試一下:

//https://tool.lu/coderunner/ //來源:技術(shù)讓夢想更偉大 //作者:李肖遙 #include intmain() { inta=5,b=7,c; c=a+++b; printf("a=%d,b=%d,c=%d",a,b,c); return0; }

輸出結(jié)果如下:

其執(zhí)行順序:

b不變,c = a + b;,則c = 5 + 7 = 12

a++,那么a = 6;

c = a+++++b;

上面那么可能只是開胃菜,那么這個表達(dá)式呢,有什么想法?咱們二話不說,直接上代碼測試。

//https://tool.lu/coderunner/ //來源:技術(shù)讓夢想更偉大 //作者:李肖遙 #include intmain() { inta=5,b=7,c; c=a+++++b; //c=(a++)+(++b); //c=((a++)++)+b; printf("a=%d,b=%d,c=%d",a,b,c); return0; }

編譯結(jié)果如下:

雖然一看就知道意思是(a++)+(++b);,但是編譯就通不過,我們把括號加上,c = (a++) + (++b);,編譯通過,那么出錯信息大概是:括號影響了優(yōu)先級?我們從側(cè)面以及原理來解析一下。

側(cè)面解析一下

對于a+++++b這一段代碼,編譯系統(tǒng)從左至右掃描整條語句,先遇到a++,判斷出來是一個a的后綴自加運(yùn)算;

然后接著掃描,遇到一個+,+是一個二目運(yùn)算符,它的左邊已經(jīng)有一個運(yùn)算數(shù)a++了,系統(tǒng)就向右搜索第二個運(yùn)算數(shù);

又遇到一個+,++比+的運(yùn)算級別要高,這時,編譯系統(tǒng)就將兩個+看成一個整體來處理;

既然是++,編譯系統(tǒng)就認(rèn)定,肯定它的左邊或右邊有一個變量,編譯系統(tǒng)先搜索左邊,發(fā)現(xiàn)++,不是變量;

再搜索右邊,發(fā)現(xiàn)+b,+b是什么東西?編譯系統(tǒng)是無法搞明白的;

因此它就認(rèn)為++是一個缺少左值的自增運(yùn)算符,于是提示錯誤給用戶:lvalue required as increment operand

原理解析一下

C語言在這里遵循詞法解析的貪婪匹配原則。優(yōu)先匹配盡可能多字符的符號,無論是否有語法錯誤(因?yàn)樵~法分析時還沒有語法檢查)。

于是a+++++b會被當(dāng)作a ++ ++ + b,這是非法的表達(dá)式,因此產(chǎn)生編譯錯誤。

這個問題在ISO C99標(biāo)準(zhǔn)中直接以示例描述,原文如下:

EXAMPLE 2 The program fragment x+++++y is parsed as x ++ ++ + y, which violates a constraint onincrement operators, even though the parse x ++ + ++ y might yield a correct expression.

那么,也許是c = ((a++)++) + b;這個意思呢?

我們編譯結(jié)果依然報(bào)錯,如下:

這涉及到“左值”的問題。百度百科定義如下:

左值(lvalue) 是B語言/C語言/C++語言等類C語言中的一類表達(dá)式。“左”(left)的原意是指可以放在賦值符號“=”的左邊,但其實(shí)也表示能作為&和++等操作符的操作數(shù)(B語言中已經(jīng)如此)。而且,現(xiàn)代C/C++中的含義已經(jīng)不局限于此。lvalue的l被重新解釋為location。這也對應(yīng)于ISO C11/ISO C++11的內(nèi)存位置(memory location)。

總結(jié):a存在左值,可以有表達(dá)式:a++。但是(a++)不存在左值,無法繼續(xù)執(zhí)行(a++)++操作,所以最終報(bào)錯。

怎么樣才能編譯正確呢?

a+++++b在編譯時會報(bào)錯,那么a++ + ++b呢?來看以下代碼:

//https://tool.lu/coderunner/ //來源:技術(shù)讓夢想更偉大 //作者:李肖遙 #include intmain() { inta=5,b=7,c; c=a+++++b; printf("a=%d,b=%d,c=%d",a,b,c); return0; }

結(jié)果如下:

其代碼與c = (a++) + (++b);結(jié)果一樣,說明是正確的,其按照下面順序執(zhí)行:

先執(zhí)行b自加,b變?yōu)?;相當(dāng)于:b = b+ 1;

求a與b之和,賦給c;相當(dāng)于:c = a + b ;//c = 5+8;

執(zhí)行第二步之后,a自加1:a++;

c=(++a,b++,a++,++b);

這個表達(dá)式看著爽不爽?我們知道自增自減運(yùn)算,表示對自身進(jìn)行a=a+1或者a=a-1的運(yùn)算。

++a表示在調(diào)用前就a+1,a++表示在調(diào)用后+1。

int c=(++a,b++,a++,++b);這個逗號隔開的表示用最后一個式子對C進(jìn)行賦值,測試如下:

//https://tool.lu/coderunner/ //來源:技術(shù)讓夢想更偉大 //作者:李肖遙 #include intmain() { inta=5,b=7,c; c=(++a,b++,a++,++b); printf("a=%d,b=%d,c=%d",a,b,c); return0; }

輸出的結(jié)果如下:

這段執(zhí)行的順序如下

先執(zhí)行++a,a=6;

再執(zhí)行b++,b=8;

接下來a++,a=7;

再執(zhí)行++b,b=9;

把最后一個的式子b=9的值賦給c,所以c等于9。如果改成c=(++a,b++,a++,b++); ,那么c就是等于8,因?yàn)槭钦{(diào)用后再自增。

總結(jié)

我們看到這些有趣且不常見的代碼的時候,無需懷疑,只需要根據(jù)經(jīng)驗(yàn)一步一步分析,就會發(fā)現(xiàn)其中的玄妙之處。在此我總結(jié)以下幾點(diǎn)。

如果你一看就知道了答案,或猜出正確答案,說明基礎(chǔ)做得好,點(diǎn)個贊。

如果你很猶豫,不知道答案,這也是正常的,因?yàn)楹苌僖姷竭@樣寫代碼的,但是我們也需要去了解,才能究其根源。

我總結(jié)這個問題,是想提起一個關(guān)于代碼編寫風(fēng)格,代碼的可讀性,代碼的可修改性的話題,這樣我們在寫代碼的時候才能夠注意到,更好的編碼。

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

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140328
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70253
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1654

    瀏覽量

    49887

原文標(biāo)題:淺析C語言中一些“令人吃驚”的結(jié)構(gòu)

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

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

    距離Robotaxi上線僅剩數(shù)周,特斯拉尚未開始無安全員測試引發(fā)質(zhì)疑

    令人震驚的是,截至上個月,特斯拉尚未開始進(jìn)行無安全員的道路測試。
    的頭像 發(fā)表于 05-15 17:58 ?134次閱讀

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

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

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

    一些問題:學(xué)了不少語法,指針、數(shù)組、結(jié)構(gòu)體都能看懂,但到真正寫程序時就不知道該如何下手;看了不少教程,甚至能背下來一些代碼模板,但遇到新問題時還是會卡住;想做個完整的
    的頭像 發(fā)表于 03-14 17:37 ?348次閱讀
    為什么學(xué)了<b class='flag-5'>C</b><b class='flag-5'>語言</b>,卻寫不出像樣的項(xiàng)目?

    今年,還要搶GPU?

    能指標(biāo)上與世界頂級大模型,如Meta的Llama3.1、OpenAI的GPT-4、Anthropic的ClaudeSonnet3.5等,不分伯仲。最令人震驚的是,Dee
    的頭像 發(fā)表于 02-14 10:04 ?362次閱讀
    今年,還要搶GPU?

    分析C語言代碼結(jié)構(gòu)的設(shè)計(jì)問題

    來分析C語言代碼結(jié)構(gòu)的設(shè)計(jì)問題。 這段代碼,使用了兩次malloc,分別給 p1 和 p2 申請了內(nèi)存。用完后,內(nèi)存釋放,防止內(nèi)存泄漏。 大家覺得,這樣的代碼設(shè)計(jì)有沒有問題。 代碼
    的頭像 發(fā)表于 02-11 09:31 ?310次閱讀

    一些常見的動態(tài)電路

    無論是模電還是數(shù)電,理論知識相對來說還是比較枯燥,各種電路原理理解清楚不算容易,換種生動形象的方式或許會增加一些趣味性,也更容易理解這些知識。下面整理了一些常見的電路,以動態(tài)圖形的方式展示。 整流
    的頭像 發(fā)表于 11-16 09:26 ?951次閱讀
    <b class='flag-5'>一些</b>常見的動態(tài)電路

    分享一些常見的電路

    理解模電和數(shù)電的電路原理對于初學(xué)者來說可能比較困難,但通過一些生動的教學(xué)方法和資源,可以有效地提高學(xué)習(xí)興趣和理解能力。 下面整理了一些常見的電路,以動態(tài)圖形的方式展示。 整流電路 單相橋式整流
    的頭像 發(fā)表于 11-13 09:28 ?716次閱讀
    分享<b class='flag-5'>一些</b>常見的電路

    C語言C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?660次閱讀

    傳諾基亞大裁員,大中華區(qū)占五分之

    諾基亞(Nokia Corporation)正在積極推進(jìn)其成本削減計(jì)劃,以應(yīng)對當(dāng)前的市場挑戰(zhàn)。據(jù)最新消息,諾基亞已在大中華區(qū)裁減了近2000名員工,占該地區(qū)員工總數(shù)的五分之,這數(shù)字令人震驚
    的頭像 發(fā)表于 10-18 17:16 ?1094次閱讀

    LED驅(qū)動器應(yīng)用的一些指南和技巧

    電子發(fā)燒友網(wǎng)站提供《LED驅(qū)動器應(yīng)用的一些指南和技巧.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 11:35 ?0次下載
    LED驅(qū)動器應(yīng)用的<b class='flag-5'>一些</b>指南和技巧

    hex文件怎么能轉(zhuǎn)回去c語言

    的差異。 然而,如果你想要從 .hex 文件中獲取一些有用的信息或者對程序進(jìn)行分析,你可以采取以下步驟來盡可能接近原始的C語言邏輯: 反匯編 : 使用反匯編工具(如IDA Pro、Ghidra等)將 .hex 文件中的機(jī)器碼轉(zhuǎn)換
    的頭像 發(fā)表于 09-02 10:46 ?4007次閱讀

    hex文件如何查看原c語言代碼

    是處理器可以直接執(zhí)行的指令,而 C 語言代碼則是人類可讀的高級編程語言代碼。 然而,如果你想要從 .hex 文件中獲取一些有用的信息或者對程序進(jìn)行分析,你可以考慮以下幾種方法: 反匯編
    的頭像 發(fā)表于 09-02 10:37 ?4376次閱讀

    技術(shù)干貨驛站 ▏深入理解C語言:掌握程序結(jié)構(gòu)知識

    在計(jì)算機(jī)編程的世界中,C語言被廣泛認(rèn)可為門強(qiáng)大而高效的編程語言,其簡潔的語法和直接的指令使得它成為了許多程序員的首選。了解C
    的頭像 發(fā)表于 07-27 08:45 ?1765次閱讀
    技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:掌握程序<b class='flag-5'>結(jié)構(gòu)</b>知識

    按照這樣學(xué)習(xí)C語言,成為卷王不是夢!

    一些學(xué)習(xí)C語言的建議,讓你在學(xué)習(xí)之路上更加游刃有余,成為C語言的高手。按照這樣學(xué)習(xí)C
    的頭像 發(fā)表于 07-06 08:04 ?568次閱讀
    按照這樣學(xué)習(xí)<b class='flag-5'>C</b><b class='flag-5'>語言</b>,成為卷王不是夢!

    c語言怎么做可視化界面

    C語言種通用的編程語言,廣泛應(yīng)用于系統(tǒng)編程、嵌入式開發(fā)等領(lǐng)域。雖然C語言本身并不支持直接創(chuàng)建
    的頭像 發(fā)表于 06-06 10:46 ?3360次閱讀