日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于表达式i+++i+++i++有感

發(fā)布時間:2025/3/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于表达式i+++i+++i++有感 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

????前幾天我看到了關(guān)于c語言中i+++i+++i++的問題討論。有認(rèn)為值是確定的,也有認(rèn)為是不確定的。我本來傾向于確定的,即well-defined。本來想NB一把,咱們翻標(biāo)準(zhǔn)準(zhǔn)確說明它就是well-defined,結(jié)果卻發(fā)現(xiàn)它是undefined。這不,一想那不是更厲害了,直接把前面認(rèn)為確定的人都否定了。當(dāng)即組織材料,自己也寫個回復(fù)。寫出來后那是相當(dāng)?shù)挠谐删透邪?#xff0c;就等著別人來討論討論。但是我更渴望別人也覺得我觀點是對,滿足一下自己這顆虛榮心,^_^。不過好傷心啊,沒人回復(fù)。

? ? 不過話說回來啊,這個過程挺有趣的。先是自己帶著觀點去找證據(jù),結(jié)果發(fā)現(xiàn)觀點錯了,又找證據(jù)證明另一個觀點,最后把一點一點碎片組織起來,就成一篇小文章了。我想啊,那些發(fā)表論文的,當(dāng)寫完審查完那一刻肯定是相當(dāng)滿足了。開始先是一個一個的lemma, 然后是corollary, 最后就是自己的theorem了。突然感覺寫程序的過程也很像。先是小函數(shù),小函數(shù)組成大一點的函數(shù),慢慢的自己的程序也就浮現(xiàn)出來。其實,還有很多過程都很像,不是嗎?

? ? 好了,在這就再貼下自己的回答,保存下,也再成就感一下。如果有錯誤,麻煩大家給指出啦。

標(biāo)準(zhǔn)中提到tranlation有7個階段,下面是第3階段的描述(c99 5.1.1.2)


The source file is decomposed into preprocessing tokens and sequences of white-space characters(including comments). 這個階段先于第4階段的預(yù)處理發(fā)生。在preprocessing tokens的定義里面包括punctuator。而punctuator里面包括operator。所以根據(jù)下面的這兩段話(c99 6.4):



If the input stream has been parsed into preprocessing tokens up to a given character, the next preprocessing token is the longest sequence of characters that could constitute a preprocessing token. EXAMPLE 2 The program fragment x+++++y is parsed as x ++ ++ + y 我很有理由認(rèn)為i+++j 這個表達(dá)式肯定是分析成i ++ + j。而這些只是preprocessing tokens,在translation的第7階段才把這些轉(zhuǎn)換成標(biāo)準(zhǔn)中定義的tokens,然后再進(jìn)行語法的分析。tokens已經(jīng)被分成那樣了,根據(jù)優(yōu)先級,應(yīng)該是(i++) + y。所以,我認(rèn)為 i+++i+++i++ 在語法上是被分析為(i++)+(i++)+(i++)。


下面是說明這個式子是undefined的。其實標(biāo)準(zhǔn)里面讓它undefined的說明關(guān)鍵就一個了(c99 6.5):


Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. 這里的第一句話就讓式子undefined的了。對于sequence point,標(biāo)準(zhǔn)里的定義是informative(不懂啥含義)的,其中包括the end of a full expression,而full expression定義如下(c99 6.8)



A full expression is an expression that is not part of another expression or of a declarator.

所以,上訴式子是“Between the previous and next sequence point“無誤了。而且標(biāo)準(zhǔn)中還給了兩個由于6.5那段而undefined的例子:

i = ++i + 1; a[i++] = i;

所以,我的結(jié)論是式子i+++i+++i++只能被分析成(i++)+(i++)+(i++),但結(jié)果是undefined。

ps:對于6.5那段的第二句我不是太理解,參考了一下別人的說法暫時理解為:

如果兩個sequence points之間要改變一個object所存的值,那么之前如果有讀取此object的值,那么這個之前讀的舊值必定是用來確定新值的。

不知道理解正與否。

參考:

ISO標(biāo)準(zhǔn)

http://stackoverflow.com/questions/3978625/using-postfix-increment-in-an-l-value

http://c-faq.com/expr/seqpoints.html


轉(zhuǎn)載于:https://my.oschina.net/u/582355/blog/137168

總結(jié)

以上是生活随笔為你收集整理的关于表达式i+++i+++i++有感的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。