国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

C語言會同意一些"令人震驚"的結構

GReq_mcu168 ? 來源:玩轉單片機 ? 2020-09-02 11:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

c = a+++b;

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

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

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

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

c=a+++b;

我們來測試一下:

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

輸出結果如下:

其執行順序:

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

a++,那么a = 6;

c = a+++++b;

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

//https://tool.lu/coderunner/ //來源:技術讓夢想更偉大 //作者:李肖遙 #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; }

編譯結果如下:

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

側面解析一下

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

然后接著掃描,遇到一個+,+是一個二目運算符,它的左邊已經有一個運算數a++了,系統就向右搜索第二個運算數;

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

既然是++,編譯系統就認定,肯定它的左邊或右邊有一個變量,編譯系統先搜索左邊,發現++,不是變量;

再搜索右邊,發現+b,+b是什么東西?編譯系統是無法搞明白的;

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

原理解析一下

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

于是a+++++b會被當作a ++ ++ + b,這是非法的表達式,因此產生編譯錯誤。

這個問題在ISO C99標準中直接以示例描述,原文如下:

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;這個意思呢?

我們編譯結果依然報錯,如下:

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

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

總結:a存在左值,可以有表達式:a++。但是(a++)不存在左值,無法繼續執行(a++)++操作,所以最終報錯。

怎么樣才能編譯正確呢?

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

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

結果如下:

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

先執行b自加,b變為8;相當于:b = b+ 1;

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

執行第二步之后,a自加1:a++;

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

這個表達式看著爽不爽?我們知道自增自減運算,表示對自身進行a=a+1或者a=a-1的運算。

++a表示在調用前就a+1,a++表示在調用后+1。

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

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

輸出的結果如下:

這段執行的順序如下

先執行++a,a=6;

再執行b++,b=8;

接下來a++,a=7;

再執行++b,b=9;

把最后一個的式子b=9的值賦給c,所以c等于9。如果改成c=(++a,b++,a++,b++); ,那么c就是等于8,因為是調用后再自增。

總結

我們看到這些有趣且不常見的代碼的時候,無需懷疑,只需要根據經驗一步一步分析,就會發現其中的玄妙之處。在此我總結以下幾點。

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

如果你很猶豫,不知道答案,這也是正常的,因為很少見到這樣寫代碼的,但是我們也需要去了解,才能究其根源。

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

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

    關注

    183

    文章

    7644

    瀏覽量

    145601
  • 代碼
    +關注

    關注

    30

    文章

    4968

    瀏覽量

    73973
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

    51614

原文標題:淺析C語言中一些“令人吃驚”的結構

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言主要特點

    C語言的主要特點有: 1.語言簡潔、緊湊,使用方便、靈活 。C語言共只有32個關鍵字、9種控制
    發表于 01-05 07:41

    C語言中一些令人震驚結構介紹

    C語言同意一些令人震驚結構,下面的結構是合法的嗎,
    發表于 12-23 08:15

    單片機C語言編程的心得

    出來。 、.H文件與.C文件的關系: 迄今為止,寫過的程序都是一些很簡單的程序,從來沒有想到要自己寫.H文件,也不知道.H文件到底什么用,與.C文件什么關系。只是最近寫鍵盤程序,參
    發表于 12-08 07:44

    C語言的編程技巧

    個成員是個未知大小的數組,適用于動態分配內存并關聯個可變長度的數組。? ?3、匿名結構體和聯合體?:C
    發表于 11-27 06:46

    C語言程序的結構

    ,87LPC764有4KB的Flash ROM,而筆者的程序量只有2KB多點,因而第個想法是改用C語言作為主要的開發語言,應該不至于導致代碼空間不夠用。其次,考慮到需要定時功能的模塊
    發表于 11-26 08:12

    C語言的分支結構介紹

    1.簡單if語句 C語言中的分支結構語句中的if條件語句。 簡單if語句的基本結構如下: 代碼語言:javascript if(表達
    發表于 11-25 07:48

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

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

    C語言結構體使用

    型的數據組合。 結構體的聲明與定義 結構體的聲明般形式為: c struct 結構體名{ 成員1; 成員2; ... }; /
    發表于 11-12 08:30

    CICC2033:關于C語言仿真的一些說明

    C語言運行說明 操作說明(以helloworld為例) 1、在SDK環境下寫好C語言相關代碼。 最簡單的寫法為根據已有demo進行更改。如果說需要重新創建新的SDK項目,具體寫法
    發表于 10-21 14:18

    距離Robotaxi上線僅剩數周,特斯拉尚未開始無安全員測試引發質疑

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

    Debian和Ubuntu哪個好一些

    兼容性對比Debian和Ubuntu哪個好一些,并為您揭示如何通過RAKsmart服務器釋放Linux系統的最大潛能。
    的頭像 發表于 05-07 10:58 ?1146次閱讀

    深入理解C語言C語言循環控制

    C語言編程中,循環結構是至關重要的,它可以讓程序重復執行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環,C語言提供了多種循
    的頭像 發表于 04-29 18:49 ?2047次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環控制

    使用RTD5.0.0的s32k312,C40_Ip擦除pflash存在一些問題求解決

    我正在使用 RTD5.0.0 的 s32k312,C40_Ip擦除 pflash 存在一些問題: Erase block0(0x420000-0x500000) failed
    發表于 04-11 06:53

    ?證監會同意新恒匯公司上市注冊 中國傳感器首富韋爾股份虞仁榮為最大股東 實控2家?A股上市公司

    ? 證監會同意!中國傳感器首富,實控兩家A股上市公司! ? ? 3月14日,證監會同意新恒匯公司在深圳證券交易所創業板上市注冊的批復,這意味著新恒匯電子股份有限公司正式登陸深交所創業板,這是中國首家
    的頭像 發表于 03-25 18:45 ?5784次閱讀
    ?證監<b class='flag-5'>會同意</b>新恒匯公司上市注冊 中國傳感器首富韋爾股份虞仁榮為最大股東 實控2家?A股上市公司

    為什么學了C語言,卻寫不出像樣的項目?

    一些問題:學了不少語法,指針、數組、結構體都能看懂,但到真正寫程序時就不知道該如何下手;看了不少教程,甚至能背下來一些代碼模板,但遇到新問題時還是會卡?。幌胱鰝€完整的
    的頭像 發表于 03-14 17:37 ?920次閱讀
    為什么學了<b class='flag-5'>C</b><b class='flag-5'>語言</b>,卻寫不出像樣的項目?