int (*pf)(1024)為什麼是函數調用?

《深度探索C++對象模型》1.2節中說對於表達式:

int (*pf)(1024);

直到看到1024才能知道這是一個函數調用,而不是一個聲明,如何理解這句話啊?

後面還有一個例子,說:

int (*pq)();

運用上面那個例子的look-head方法都不能知道這到底是一個函數調用還是一個聲明。最後書上說了這是一個聲明,但是沒有說具體的方法,原因是因為對C的聲明語法的兼容性引起的,所以對於後面的這個表達式,需要引進一個超越語言範圍的規則,這個規則會判斷第二個表達式為聲明。


int (*pf)(1024);

我認為這個並不是一個調用,而且這個表達式非法。

如果是

(*pf)(1024);

我想這是一個調用

int (*pq)();

我想這是一個聲明,聲明了一個函數指針。

(int) (*pf)(1024);

我想這也是一個調用,並且作了強制類型轉換

int f(int a) {
return 1;
}
int main(void) {
int(*pf1)();
int(*pf2)(int);
pf2 = f;
int(*pf2)(1024);
return 0;
}

我編寫了一個測試樣例,如果你堅持認為int(*pf)(1024)是一個調用的話,請告訴我哪個編譯器能編譯通過它,因為我個人對C的語言標準不是很理解,我希望看一看編譯器的實現來感受一下語言標準。

總之我的多個編譯器都報錯了。


1024是一個確定的值,是實參不是形參。

後一條括弧裡面是空的,沒有出現實參或者形參,就無從判斷。

可是前面那個int是什麼鬼?


我來強答一下。我翻了一下原文,聯繫上下文的話我覺得要讓這個例子變得正確只能自己腦補一下:

……直到看到常數1024才能確定這是一個函數調用(腦補:同時由於前面有個不知道什麼鬼int,編譯器直到看到這個1024,才能愉快地報錯)

順便引一段看到的關於這本書的博客評論:

One more thing I would like to mention if you want to read this book is that the book has some number of typos and wrong diagrams so be prepare for that because I spent hours to figure out the code but it turned out that there was typo.

然後感覺這個網站也可能有點用:

勘誤:深度探索 C++ 物件模型

以上。

不喜勿看:鑒於C++實在太多太多的坑而且對一般用戶沒有明顯的好處,建議別輕易入坑。如果題主還非常有錢的話,可以用學C++十分之一的時間去學學MATLAB


int (*pf)(1024);

1024是一個數值,這肯定不是聲明,前面int是不是少了一個括弧??

應該是這樣吧:

(int) (*pf)(1024);


推薦閱讀:

為什麼 Windows API 使用 stdcall 調用約定?
c++中的字元串常量為什麼可以賦值給char*?
我想自己用C/C++做一個腳本語言解釋器,但是不知道需要什麼知識?
c語言中實際上不存在賦值語句?
為什麼GCC會把0xBE-0x33解釋為浮點數?

TAG:編程語言 | C編程語言 | C | CC |