色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

C語言那些"令人震驚"的結(jié)構(gòu)分析

GReq_mcu168 ? 來源:CSDN技術(shù)社區(qū) ? 作者:CSDN技術(shù)社區(qū) ? 2020-10-09 11:58 ? 次閱讀

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

c = a+++b;

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

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

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

根據(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;

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

//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的后綴自加運算;

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

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

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

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

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

原理解析一下

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

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

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

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

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

左值(lvalue) 是B語言/C語言/C++語言等類C語言中的一類表達式。“左”(left)的原意是指可以放在賦值符號“=”的左邊,但其實也表示能作為&和++等操作符的操作數(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存在左值,可以有表達式:a++。但是(a++)不存在左值,無法繼續(xù)執(zhí)行(a++)++操作,所以最終報錯。

怎么樣才能編譯正確呢?

a+++++b在編譯時會報錯,那么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)?;相當于:b = b+ 1;

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

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

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

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

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

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

//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,因為是調(diào)用后再自增。

總結(jié)

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

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

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

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

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

    關(guān)注

    180

    文章

    7608

    瀏覽量

    137111

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    震驚啊,對癥下藥,網(wǎng)絡(luò)三“害蟲”有治咯!

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

    漫談C語言結(jié)構(gòu)

    我放在下面。  在此,我會圍繞以下2個問題來分析和應(yīng)用C語言結(jié)構(gòu)體:  1. C語言中的
    發(fā)表于 11-15 15:59

    5G基礎(chǔ)設(shè)施發(fā)展有什么趨勢?

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

    5G基礎(chǔ)設(shè)施和對端到端可編程性的需求有哪些?

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

    數(shù)據(jù)結(jié)構(gòu)與算法分析(C語言版)

    電子發(fā)燒友網(wǎng)站提供《數(shù)據(jù)結(jié)構(gòu)與算法分析(C語言版).txt》資料免費下載
    發(fā)表于 11-28 11:05 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)與算法分析C語言描述(原書第2版)

    電子發(fā)燒友網(wǎng)站提供《數(shù)據(jù)結(jié)構(gòu)與算法分析C語言描述(原書第2版).txt》資料免費下載
    發(fā)表于 12-17 14:13 ?0次下載

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

    比特幣的瘋漲造成了一種經(jīng)濟學(xué)困惑。數(shù)年內(nèi)超萬倍的漲幅令人震驚錯愕。
    的頭像 發(fā)表于 12-26 13:37 ?4365次閱讀

    數(shù)據(jù)結(jié)構(gòu)與算法分析C語言描述的電子教材詳細資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是數(shù)據(jù)結(jié)構(gòu)與算法分析C語言描述的電子教材詳細資料免費下載
    發(fā)表于 08-09 17:36 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)與算法分析C語言描述

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

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

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

    你所想不到的十個關(guān)于大數(shù)據(jù)令人震驚的事實

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

    C語言的3種循環(huán)結(jié)構(gòu)分析

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

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

    近日,特斯拉人形機器人亮相世界人工智能大會,展現(xiàn)了全新的關(guān)節(jié)設(shè)計結(jié)構(gòu)
    發(fā)表于 07-26 14:50 ?349次閱讀
    主站蜘蛛池模板: 欧美整片华人play| 国产精品大全国产精品| 日韩亚洲国产欧美免费观看| 成人在线观看视频免费| 一一本之道高清视频在线观看中文字幕| 最近2019中文字幕MV免费看| 伊人久久网站| 91九色视频在线观看| SM高H黄暴NP辣H调教性奴| 超碰免费视频公开97| 俄罗斯女人Z0ZOZO| 国产亚洲精品A久久777777| 国产真实强被迫伦姧女在线观看| 九色91精品国产网站| 免费人成网站在线观看10分钟| 日本一卡2卡3卡四卡精品网站| 天天国产在线精品亚洲| 亚洲精品AV无码喷奶水糖心| 正在播放黑人杂交派对卧槽| jjzz韩国| 国产日韩欧美三级| 久久婷婷五月免费综合色啪| 欧美残忍xxxx极端| 无码国产成人777爽死在线观看| 亚洲区视频| 99精品久久久久久久| 国产精品1卡二卡三卡四卡乱码| 九色PORNY蝌蚪视频首页| 男女交性视频无遮挡全过程| 沈阳熟女露脸对白视频| 亚洲三级在线看| 99久久全国免费久久爱| 国产精品视频国产永久视频 | 甜宠溺H宝贝嗯撞PLAY啊 | 猫咪最新破解版下载| 色吧电影院| 伊人国产在线播放| 春药按摩人妻中文字幕| 久久9精品区-无套内射无码| 热巴两次用约老师屁股发底线球| 亚洲国产cao|