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

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

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

3天內不再提示

C語言那些"令人震驚"的結構分析

GReq_mcu168 ? 來源:CSDN技術社區 ? 作者:CSDN技術社區 ? 2020-10-09 11:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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語言
    +關注

    關注

    180

    文章

    7632

    瀏覽量

    141705

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言令人抓狂的一面——全局變量

    作為一名程序員,如果說沉迷一門編程語言算作一種樂趣的話,那么與此同時反過來去黑一門編程語言就是這種樂趣的升華。今天我們就來黑一把C語言,好好展示一下這門經典
    發表于 01-16 11:07 ?643次閱讀

    C語言C++中那些不同的地方

    ++11標準。根據不同的標準,它們的功能也會有所不同,但是越新的版本支持的編譯器越少,所以本文在討論的時候使用的C語言標準是C89,C++標準是C
    的頭像 發表于 12-07 14:29 ?1570次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>和<b class='flag-5'>C</b>++中<b class='flag-5'>那些</b>不同的地方

    震驚啊,對癥下藥,網絡三“害蟲”有治咯!

    `震驚啊,對癥下藥,網絡三“害蟲”有治咯!超令人震驚,上網的親們,該來圍觀一下啦!網絡“三毒蟲”,要對癥下藥,最新的網絡技術發明,老子終于能治你咯!大家都知道,路由器是網絡的第一道關口,也是網絡
    發表于 06-21 19:31

    漫談C語言結構

    我放在下面。  在此,我會圍繞以下2個問題來分析和應用C語言結構體:  1. C語言中的
    發表于 11-15 15:59

    5G基礎設施發展有什么趨勢?

    我們目前處于蜂窩連接的轉型時期,未來無處不在的無線連接正在興起。在全球范圍內,2G、3G和4G的成功推動手機使用量達到了令人難以置信的75億部。令人震驚的是,這使得移動設備的數量比全球人口還要多
    發表于 08-01 08:06

    5G基礎設施和對端到端可編程性的需求有哪些?

    我們目前處于蜂窩連接的轉型時期,未來無處不在的無線連接正在興起。在全球范圍內,2G、3G和4G的成功推動手機使用量達到了令人難以置信的75億部。令人震驚的是,這使得移動設備的數量比全球人口還要多
    發表于 10-08 09:37

    數據結構與算法分析(C語言版)

    電子發燒友網站提供《數據結構與算法分析(C語言版).txt》資料免費下載
    發表于 11-28 11:05 ?0次下載

    比特幣瘋漲背后的四個原因以及是否存在騙局的分析

    比特幣的瘋漲造成了一種經濟學困惑。數年內超萬倍的漲幅令人震驚錯愕。
    的頭像 發表于 12-26 13:37 ?4540次閱讀

    數據結構與算法分析C語言描述的電子教材詳細資料免費下載

    本文檔的主要內容詳細介紹的是數據結構與算法分析C語言描述的電子教材詳細資料免費下載
    發表于 08-09 17:36 ?0次下載

    數據結構與算法分析C語言描述

    《數據結構與算法分析C語言描述》曾被評為20世紀頂尖的30部計算機著作之一,作者在數據結構和算法分析
    發表于 10-14 08:00 ?17次下載
    數據<b class='flag-5'>結構</b>與算法<b class='flag-5'>分析</b>—<b class='flag-5'>C</b><b class='flag-5'>語言</b>描述

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

    這個代碼確實不咋符合習慣的寫法,但是不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?
    的頭像 發表于 09-02 11:32 ?1631次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>會同意一些"<b class='flag-5'>令人震驚</b>"的<b class='flag-5'>結構</b>

    你所想不到的十個關于大數據令人震驚的事實

    “大數據”這一術語的來源是有原因的,其規模確實非常大。但是,要掌握信息數字化的增長并不容易。因此精心整理了有關當今數據專家的這10個令人震驚的事實,并展望了未來的趨勢。
    的頭像 發表于 09-10 15:31 ?3525次閱讀

    C語言的3種循環結構分析

    C語言的循環結構有for循環、while循環、do循環和goto循環。本文介紹前3種循環方式。 1. for循環結構 for循環也可以稱為步進循環,它的特點是常用于已經明確了循環的范圍
    的頭像 發表于 05-20 13:43 ?1.2w次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的3種循環<b class='flag-5'>結構</b><b class='flag-5'>分析</b>

    令人震驚的特斯拉機器人!

    近日,特斯拉人形機器人亮相世界人工智能大會,展現了全新的關節設計結構
    發表于 07-26 14:50 ?454次閱讀

    分析C語言代碼結構的設計問題

    分析一個C語言代碼結構的設計問題。 這段代碼,使用了兩次malloc,分別給 p1 和 p2 申請了內存。用完后,內存釋放,防止內存泄漏。 大家覺得,這樣的代碼設計有沒有問題。 代碼
    的頭像 發表于 02-11 09:31 ?370次閱讀