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解釋為浮點數?