亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: donotblock
打印 上一主題 下一主題

[C] 優(yōu)先級,結(jié)合性,序列點(diǎn), 你理解清楚了么? [復(fù)制鏈接]

論壇徽章:
0
11 [報告]
發(fā)表于 2010-12-29 19:44 |只看該作者
受教了,以前在學(xué)校的時候,老師還真是沒講過“序列點(diǎn)”啊,什么的。

關(guān)于C的好多知識都還是在CU上學(xué)到的。

論壇徽章:
0
12 [報告]
發(fā)表于 2010-12-29 19:58 |只看該作者
回復(fù)  davelv

  謝謝!
KBTiller 發(fā)表于 2010-12-29 19:41

看完第一部分我會寫個詳細(xì)的評論和討論列表的,雖然現(xiàn)在還沒看幾章,但已經(jīng)受益良多了。

論壇徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辭舊歲徽章
日期:2015-03-03 16:54:152015年亞洲杯之約旦
日期:2015-02-11 14:38:37雙魚座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29雙子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亞洲杯之科威特
日期:2015-04-17 16:51:51
13 [報告]
發(fā)表于 2010-12-29 20:25 |只看該作者
回復(fù) 6# donotblock


    in any order  conforming to the precedence rules

    這個的意思是“以任何遵守優(yōu)先級規(guī)則的順序”吧,同樣的條目在ISO/IEC 9899:1999(E)(應(yīng)該就是C99)里面是這樣的:

The order in which subexpressions are evaluated and the order in which side effects
takeplace, except as specified for the function-call (), &&, ||, ?:,and comma
operators (6.5).


    即子表達(dá)式的計算順序是未指定的。但由于優(yōu)先級和結(jié)合性的規(guī)則,為了計算某個子表達(dá)式可能需要計算另一個表達(dá)式,比如a*b+c,為了計算(a*b)+c,必須先計算a*b,優(yōu)先級規(guī)則限制了這一點(diǎn)。

    另外,我認(rèn)為表達(dá)式求值和side effects的發(fā)生并不一定同時。標(biāo)準(zhǔn)中只保證某序列點(diǎn)之前的side effects在序列點(diǎn)處已經(jīng)發(fā)生,但子表達(dá)式求值總歸是有一定順序的,可能某個表達(dá)式被求值了,但side effects并未發(fā)生。

論壇徽章:
0
14 [報告]
發(fā)表于 2010-12-29 21:22 |只看該作者
本帖最后由 donotblock 于 2010-12-29 21:23 編輯
回復(fù)  donotblock


    in any order  conforming to the precedence rules

    這個的意思是“以任 ...
zhaohongjian000 發(fā)表于 2010-12-29 20:25



    這個我覺得應(yīng)該這樣理解:
    優(yōu)先級與結(jié)和性的作用只是說a*b+c應(yīng)該這樣分組(a*b)+c, 而不是a * (b +c).  你說的那個隱式的計算順序應(yīng)該是操作符+的語義決定的,(a*b)是+的第一個操作數(shù)。而evaluation,我覺得翻譯成求值還沒有完全體現(xiàn)原詞的意味,并不只是計算出一個值的意思,  本身就包括side effect。

An operator specifies an operation to be performed (an evaluation )
that yields a value, or yields a designator, or produces a side
effect, or a combination thereof.


其實(shí)我們的觀點(diǎn)沒有大的不同,這樣辨析下去有點(diǎn)學(xué)究的意味了

論壇徽章:
0
15 [報告]
發(fā)表于 2010-12-30 08:43 |只看該作者
本帖最后由 davelv 于 2010-12-30 08:44 編輯
回復(fù)  donotblock


    in any order  conforming to the precedence rules

    這個的意思是“以任 ...
zhaohongjian000 發(fā)表于 2010-12-29 20:25

求值無順序,這點(diǎn)C標(biāo)準(zhǔn)已經(jīng)說的很明確了。
例如a*b+c這個表達(dá)式,不一定先計算a*b,也許先計算c,c的值無非就是c變量本身。這點(diǎn)也許不夠明確,但是舉個不恰當(dāng)?shù)睦印?br /> ++a*b + a 如果真的有計算順序,這個表達(dá)式也不會是未定義的行為了。

論壇徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辭舊歲徽章
日期:2015-03-03 16:54:152015年亞洲杯之約旦
日期:2015-02-11 14:38:37雙魚座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29雙子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亞洲杯之科威特
日期:2015-04-17 16:51:51
16 [報告]
發(fā)表于 2010-12-30 09:15 |只看該作者
回復(fù) 14# donotblock


    優(yōu)先級與結(jié)和性的作用只是說a*b+c應(yīng)該這樣分組(a*b)+c, 而不是a * (b +c).  你說的那個隱式的計算順序應(yīng)該是操作符+的語義決定的,(a*b)是+的第一個操作數(shù)。而evaluation,我覺得翻譯成求值還沒有完全體現(xiàn)原詞的意味,并不只是計算出一個值的意思,  本身就包括side effect。


    這樣解釋好像的確沒什么問題,關(guān)于這一點(diǎn)應(yīng)該是觀察角度不一樣。不過關(guān)于求值,我不同意你的觀點(diǎn)。如果一個表達(dá)式求值的時候其side effect就發(fā)生了,一切就簡單多了。side effects的發(fā)生時間只由序列點(diǎn)來保證,比如:
  1. int a = 2;
  2. int b = a++ + a++;
復(fù)制代碼
兩個a++的計算順序是不確定的,但如果side effects在求值的時候就發(fā)生了,那么無論先求哪個結(jié)果都是5,而實(shí)際情況不是這樣(gcc下不開優(yōu)化結(jié)果是4)。而如果認(rèn)為求值的時候side effects不一定發(fā)生就能很好的解釋了:盡管某個a++求值了,但side effects可能并未發(fā)生,a的值并未改變,于是結(jié)果為4。
    至于那段引文,只是指明了那些“動作”被執(zhí)行,并未說合適執(zhí)行,否則也用不著序列點(diǎn)了。

論壇徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辭舊歲徽章
日期:2015-03-03 16:54:152015年亞洲杯之約旦
日期:2015-02-11 14:38:37雙魚座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29雙子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亞洲杯之科威特
日期:2015-04-17 16:51:51
17 [報告]
發(fā)表于 2010-12-30 09:20 |只看該作者
求值無順序,這點(diǎn)C標(biāo)準(zhǔn)已經(jīng)說的很明確了。
例如a*b+c這個表達(dá)式,不一定先計算a*b,也許先計算c,c的值無 ...
davelv 發(fā)表于 2010-12-30 08:43



    我想說的不是a*b 和 c的值那個先計算,而是為了計算a*b + c的值,必須先計算a*b,這個邏輯上的順序不可能有例外的。

論壇徽章:
0
18 [報告]
發(fā)表于 2010-12-30 09:30 |只看該作者
回復(fù) 17# zhaohongjian000
實(shí)現(xiàn)中的無序性是給編譯器優(yōu)化留的空間,而不是給人類用的。
但是很明顯產(chǎn)生了一個副作用就是序列點(diǎn)問題,只要我們保證了序列點(diǎn)內(nèi)的一致性,在邏輯上按照有運(yùn)算順序的規(guī)則來做是沒有問題的。

這樣的話,咱們的想法是不是就一致了。

論壇徽章:
0
19 [報告]
發(fā)表于 2010-12-30 09:38 |只看該作者
回復(fù) 16# zhaohongjian000

并不是說side effect一定同時發(fā)生,而是說evaluation這個詞本身就包含觸發(fā)side effect這個意思,但什么時候觸發(fā)未定。 不像中文“求值”這個詞,就是求出結(jié)果的意思。 還是無歧義

論壇徽章:
0
20 [報告]
發(fā)表于 2010-12-30 09:43 |只看該作者
本帖最后由 donotblock 于 2010-12-30 10:10 編輯
我想說的不是a*b 和 c的值那個先計算,而是為了計算a*b + c的值,必須先計算a*b,這個邏輯上的順 ...
zhaohongjian000 發(fā)表于 2010-12-30 09:20

回復(fù)  zhaohongjian000
實(shí)現(xiàn)中的無序性是給編譯器優(yōu)化留的空間,而不是給人類用的。
但是很明顯產(chǎn)生了一 ...
davelv 發(fā)表于 2010-12-30 09:30



    這一點(diǎn)可以這樣舉個例子:
    對于表達(dá)式
  1. a=b++
復(fù)制代碼
編譯器可以這樣來實(shí)現(xiàn):(偽碼)
  1. a = b
  2. b=b+1
復(fù)制代碼
也可以這樣:(偽碼)
  1. b=b+1
  2. a=b-1
復(fù)制代碼
都是符合標(biāo)準(zhǔn)的,a=b++只能保證把b未加1之前的值賦給a,而且b要加上1


至于a*b + c必須先算a*b這個還是操作符的要求,標(biāo)準(zhǔn)的注27詳細(xì)解釋了這個問題,就是說優(yōu)先級高的操作符組成的表達(dá)式(或者括號括起來的)是允許作為優(yōu)先級低的操作符的操作數(shù)。

就是說這句話的語義是表達(dá)式a*b的值要加上表達(dá)式c的值,對于+來說,先算a*b還是先算c還是未定義。 而如果a*b或c有副作用,什么時候發(fā)生也是未定義的
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP