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

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

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 8811 | 回復(fù): 26
打印 上一主題 下一主題

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

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-12-29 15:24 |只看該作者 |倒序?yàn)g覽
本帖最后由 donotblock 于 2010-12-29 19:27 編輯

經(jīng)常有人問類似i=i++, c=d=c++, a=i++ * i++等表達(dá)式的值,每次還都能看到不少錯誤的回答。 理解這些問題需要弄清楚c語言的表達(dá)式求值(evaluation)過程。 今天就拋磚引玉了,希望能終結(jié)月經(jīng)貼。
一個表達(dá)式可以分兩部分來看:
副作用 - side effect, 我覺得效果這個詞比較形象一點(diǎn)。 意思是一個表達(dá)式帶來的影響
結(jié)果 - result , 就是表達(dá)式的值

比如i++, 副作用是i+1,結(jié)果是i本身。

然后是三個名詞:
優(yōu)先級 - precedence
結(jié)合性 - associativity
序列點(diǎn) - sequence point




很多人錯誤的理解了優(yōu)先級和結(jié)合性的意思,認(rèn)為它們決定了一個表達(dá)式中各子表達(dá)式的求值順序,這是錯誤理解開頭所提問題的根源。  而實(shí)際上:


1.  優(yōu)先級和結(jié)合性是的唯一作用是決定哪些操作數(shù)是屬于些操作符。

2.  優(yōu)先級和結(jié)合性不能表明哪些表達(dá)式先求值些后求值。

3.  序列點(diǎn)就是程序執(zhí)行過程中的特定點(diǎn),子表達(dá)式的求值順序只被序列點(diǎn)決定。

4.  C語言只保證,到一個序列點(diǎn)的時候,這個序列點(diǎn)前面的所有side effect都已經(jīng)完成,而且這個序列點(diǎn)后面的所有side effect都還沒有發(fā)生。

5.  上一個序列點(diǎn)后到這一個序列點(diǎn)之間,各子表達(dá)式的求值順序未定義。

6.  序列點(diǎn)包括:

     a> 函數(shù)調(diào)用(在參數(shù)處理完成,實(shí)際進(jìn)入函數(shù)之前)

     b> 在操作符邏輯與(&&), 邏輯或(||),條件(?),逗號(, 函數(shù)參數(shù)列表里不算)的第一個操作數(shù)之后。

     c> 一個完整的表達(dá)式后面,比如分號后面或者if里面的控制表達(dá)式等。

7. 對于序列點(diǎn),一個重要的原則是: 在上一個序列點(diǎn)后到這一個序列點(diǎn)之間最多改變一個對象的值一次。


例如表達(dá)式:

a=i + i++ * i++ - b;


由于++的優(yōu)先級最高,*次之,+和-的優(yōu)先級一樣,但結(jié)合性是從左到右,所以這個表達(dá)式會被解析成:


a=(i + ((i++) * (i++))) - b;


這就是優(yōu)先級和結(jié)合性的唯一作用,只是表明操作數(shù)應(yīng)該往哪個操作符上靠。 至于其中的子表達(dá)式比如兩個i++什么時候發(fā)生,什么順序發(fā)生,都是未定義的,不確定的。

而像下面這個:

i++ && i++ && i++


其執(zhí)行順序就是確定的,因?yàn)?amp;&是序列點(diǎn),每到一個&&, 就可以保證其前面所有的side effect已經(jīng)發(fā)生。


評分

參與人數(shù) 4可用積分 +24 收起 理由
zhujiang73 + 2
OwnWaterloo + 10 來晚了……
langue + 10 精品文章
wb112200 + 2

查看全部評分

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-12-29 15:29 |只看該作者
終于明白了 建議置精華。

論壇徽章:
1
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34
3 [報(bào)告]
發(fā)表于 2010-12-29 15:30 |只看該作者
看了,是阿,這樣的搞法有時候蠻煩人的。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2010-12-29 16:34 |只看該作者
1.  優(yōu)先級和結(jié)合性是的唯一作用是決定筆試客觀題的分?jǐn)?shù)。
2.  平時不要編寫這么反人類的代碼,還是用括號吧。

想終結(jié)月經(jīng)貼,不可能。除非技術(shù)筆試不考這個——其實(shí)我真覺得這么沒啥好考的,正確答案應(yīng)該是E:我保證不會寫這樣的代碼。

論壇徽章:
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
5 [報(bào)告]
發(fā)表于 2010-12-29 18:11 |只看該作者
本帖最后由 zhaohongjian000 于 2010-12-29 18:19 編輯

1.  優(yōu)先級和結(jié)合性是的唯一作用是決定哪些操作數(shù)是屬于那些操作符。
2.  優(yōu)先級和結(jié)合性不能表明那些表達(dá)式先求值那些后求值。
----------------------------------------------------------------------------

  感覺這兩點(diǎn)不正確,比如 a * b + c,由于*優(yōu)先級高于+,所以a * b先被計(jì)算(當(dāng)然,這里也可以解釋為 * 的優(yōu)先級使得a和b成為*的操作數(shù))。

  再看這個:*p++,顯然兩個操作符都是針對p的,但語義究竟是*(p++)還是(*p)++由結(jié)合性決定。關(guān)于結(jié)合性,《C專家編程》上是這么解釋的:1.它是仲裁者,在幾個操作符具有相同的優(yōu)先級時決定先執(zhí)行哪一個。2.結(jié)合性只用于表達(dá)式中出現(xiàn)兩個以上相同優(yōu)先級的操作符的情況,用于消除歧義。根據(jù)結(jié)合性,代碼:
  1. a = b = c
復(fù)制代碼
的行為也是良好定義的,這個時候結(jié)合性決定后一個 = 先計(jì)算。

  我覺得樓主在表明自己觀點(diǎn)的時候最好附上依據(jù),比如ISO C文檔中的原文,否則難以讓人信服。我英語不好,查ISO文檔有點(diǎn)困難,但我覺得關(guān)于結(jié)合性這一點(diǎn),《C專家編程》里講的應(yīng)該沒有問題。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2010-12-29 19:12 |只看該作者
本帖最后由 donotblock 于 2010-12-29 19:17 編輯
1.  優(yōu)先級和結(jié)合性是的唯一作用是決定哪些操作數(shù)是屬于那些操作符。
2.  優(yōu)先級和結(jié)合性不能表明那些表達(dá) ...
zhaohongjian000 發(fā)表于 2010-12-29 18:11


我剛發(fā)過一份ANSI C標(biāo)準(zhǔn)http://72891.cn/thread-1838474-1-2.html

你可以去看里面的A.6.1 Unspecified behavior

The order in which expressions are evaluated --- in any order
conforming to the precedence rules, even in the presence of
parentheses ($3.3).


完美的解釋了你的問題。 其它關(guān)于序列點(diǎn),可以自己在文檔里搜索一下

  1. a = b = c
復(fù)制代碼
的確是良好定義的,因?yàn)樗稀巴粋序列點(diǎn)改變一個對象值一次“的原則。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2010-12-29 19:23 |只看該作者
寫得很好,總結(jié)得非常全面。
按說這是常識性的入門知識
但是很可惜,多數(shù)C語言的初學(xué)者根本不知道
甚至他們中的很多人后來也不知道
國內(nèi)的教科書和教師應(yīng)該為那種月經(jīng)貼感到羞愧


主帖的一處微瑕
就是表達(dá)的值

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2010-12-29 19:27 |只看該作者
回復(fù) 7# KBTiller


    謝謝,已經(jīng)修正

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2010-12-29 19:39 |只看該作者
回復(fù) 7# KBTiller

您書上那部分解釋的也很不錯。

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

  謝謝!
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP