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

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

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12
最近訪問(wèn)板塊 發(fā)新帖
樓主: sonicling
打印 上一主題 下一主題

大濕 Lippman 也犯錯(cuò)? [復(fù)制鏈接]

論壇徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
11 [報(bào)告]
發(fā)表于 2012-05-15 13:44 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
12 [報(bào)告]
發(fā)表于 2012-05-15 13:56 |只看該作者
回復(fù) 11# Sevk


    區(qū)別肯定是有的,共性肯定也是有的。就看怎么去看了。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
13 [報(bào)告]
發(fā)表于 2012-05-15 14:31 |只看該作者
回復(fù) 7# bruceteen

嗯,看到int (*pf)時(shí)無(wú)法確定。
甚至對(duì)int (*pf)( ... ),如果不確定其中的內(nèi)容,依然無(wú)法確定pf是:
1. 函數(shù)指針,返回int, ... 是該函數(shù)的形式參數(shù)
2. 指針,類型int*, ...是構(gòu)造函數(shù)的實(shí)際參數(shù)



直到確定 ... 的內(nèi)容了, 比如:
i) 0
那只能解釋為指針。

ii) 1024 —— 原始例子
也只能解釋為指針。然后1024這一非0整數(shù)常量初始化指針再報(bào)告一個(gè)錯(cuò)誤。

iii) 空 —— 原始后續(xù)例子
可以解釋為兩者:
a) 函數(shù)指針,形式參數(shù)列表為空
b) 指針,實(shí)際參數(shù)列表為空
于是meta-rule決定是a) 而不是b)。 (假設(shè)如果meta-rule決定是b),那編譯會(huì)成功的,同i),都是一個(gè)空int指針。)

iv) 前面3個(gè)例子確實(shí)是用腳丫子能想出來(lái)的
更奇葩的例子,人肉分析很容易中招的,也就是Eff STL里面提到的那種類型:

  1. typedef int* pint; // 為了可讀性(或者說(shuō)迷惑性)取個(gè)名字
  2. int (*p0)(pint()); // 可以解釋為用 pint() 產(chǎn)生的臨時(shí)對(duì)象(空指針)作為 p0 這個(gè)int*變量的構(gòu)造函數(shù)的實(shí)際參數(shù)

  3. int* q = ...;
  4. int (*p1)(pint(q)); // 可以解釋為用 pint(q) 產(chǎn)生的臨時(shí)對(duì)象(與q相同的指針)作為p1這個(gè)int*變量的構(gòu)造函數(shù)的實(shí)際參數(shù)
復(fù)制代碼
但同時(shí),p0與p1都可以解釋為函數(shù)指針…… 關(guān)鍵點(diǎn)是:

  1. void f0(pint f()) {} // 通常寫法
  2. void f1(pint  ()) {} // 省略參數(shù)名,依然可以,這還不算太意外

  3. void g0(pint  x ) {} // 通常的寫法
  4. void g1(pint (x)) {} // 多加一對(duì)括號(hào),依然可以,囧死
復(fù)制代碼
所以p0又可以解釋為函數(shù)指針,返回類型int,形式參數(shù)是一個(gè)省略名字的函數(shù)指針,該函數(shù)指針不接受參數(shù)并返回pint。
而p1可以解釋為函數(shù)指針,返回類型int,形式參數(shù)名是q類型是pint。

最終根據(jù)meta-rule,p0,p1是指針變量(后面的括號(hào)是構(gòu)造函數(shù)的實(shí)際參數(shù)列表)被排除;p0,p1都是函數(shù)指針,后面的括號(hào)都是形式參數(shù)列表。

論壇徽章:
0
14 [報(bào)告]
發(fā)表于 2012-05-15 15:01 |只看該作者
回復(fù) 6# OwnWaterloo


    看了一下Efficient STL里面所說(shuō)的Most Vexing Parse。我覺得他的例子沒(méi)解釋清楚。

list<int> data(istream_iterator<int>(dataFile), // warning! this doesn't do
istream_iterator<int>()); // what you think it does


他是說(shuō)這個(gè)是聲明了一個(gè)函數(shù),輸入一對(duì)istream_iterator作為參數(shù),其中前面那個(gè)有名字,后面沒(méi)名字,并返回list。

istream_iterator<int>(dataFile) 可以看作是參數(shù)聲明,而不是當(dāng)作postfix-expression,沒(méi)問(wèn)題,因?yàn)檫@種形式本來(lái)就具有二義性,怎么解釋都不算錯(cuò)。

istream_iterator<int>() 是啥?是省略了參數(shù)名的 istream_iterator<int> 參數(shù)嗎?錯(cuò)!是返回istream_iterator<int>,參數(shù)為空的函數(shù)類型。

parameter-declaration:
    decl-specifier-seq declarator
    decl-specifier-seq declarator = assignment-expression
    decl-specifier-seq abstract-declaratoropt      <-------------- 重點(diǎn)看這一行
    decl-specifier-seq abstract-declaratoropt = assignment-expression


未命名的parameter,形式上只能是decl-specifier-seq (abstract-declarator部分被省去),后面不帶括號(hào)。
如果有括號(hào),括號(hào)部分應(yīng)該是abstract-declarator
abstract-declarator:
    ptr-operator abstract-declaratoropt
    direct-abstract-declarator
direct-abstract-declarator:
    direct-abstract-declaratoropt ( parameter-declaration-clause ) cv-qualifier-seqopt exception-specificationopt
    direct-abstract-declaratoropt [ constant-expressionopt ]
    ( abstract-declarator )


如果要把空括號(hào)看作是abstract-declarator的話,括號(hào)部分應(yīng)該是  ( parameter-declaration-clause ) ,其中 parameter-declaration-clause 可以接受空,那意義就不僅僅是參數(shù)名被省略,他是一個(gè)沒(méi)有名字的函數(shù)原型聲明!但是函數(shù)原型可以做參數(shù)類型嗎?我沒(méi)試過(guò),感覺會(huì)有問(wèn)題。


我說(shuō)這些是為了說(shuō)明C++的語(yǔ)法的確是非常復(fù)雜。Lippman 說(shuō)的沒(méi)錯(cuò),C++的語(yǔ)法解析對(duì)編譯器來(lái)說(shuō)負(fù)擔(dān)巨大。

int abcd(); // 函數(shù)聲明 abcd: {} -> int
int abcd(double); // 函數(shù)聲明 abcd: double -> int
int abcd(double ()); // 函數(shù)聲明 abcd: double (*)() -> int 姑且把函數(shù)原型當(dāng)作函數(shù)指針
int (*abcd)(double()); // 函數(shù)指針聲明 abcd : pointer to (double (*)() -> int)  姑且把函數(shù)原型當(dāng)作函數(shù)指針
int (*abcd)(double(0)); // 指針聲明并初始化 int *abcd = double(0) 有類型轉(zhuǎn)換問(wèn)題
int (*abcd)(double(*)); // 函數(shù)指針聲明 abcd: pointer to (double * -> int)

論壇徽章:
0
15 [報(bào)告]
發(fā)表于 2012-05-15 15:05 |只看該作者
GCC、CLang的語(yǔ)法分析器都是手工寫的遞歸下降分析,對(duì)不同語(yǔ)法成分的分析分散在不同函數(shù)里面,F(xiàn)在的問(wèn)題是只要輸入序列有輕微差別,整個(gè)序列的意義可能發(fā)生根本性改變。對(duì)編譯器實(shí)現(xiàn)是巨大挑戰(zhàn)。

論壇徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
16 [報(bào)告]
發(fā)表于 2012-05-15 17:23 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
17 [報(bào)告]
發(fā)表于 2012-05-15 18:52 |只看該作者
那得把所有函數(shù)名當(dāng)作函數(shù)指針變量來(lái)處理,而不能是隱式轉(zhuǎn)換為函數(shù)指針。
12
返回列表 發(fā)新帖
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP