亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在聲明變量時C ++允許我們在括號內將變量名括起來?

為什么在聲明變量時C ++允許我們在括號內將變量名括起來?

C++
MM們 2019-09-26 10:19:33
例如這樣的聲明:int (x) = 0;甚至:int (((x))) = 0;我偶然發現這是因為在我的代碼中我碰巧有一個類似于以下內容的片段:struct B{};struct C{   C (B *) {}   void f () {};};int main(){   B *y;   C (y);}顯然,我想構造一個對象C,然后在其析構函數中做一些有用的事情。但是,在發生這種情況時,編譯器將其C (y);視為y具有類型的變量聲明,C因此它會顯示有關y重新定義的錯誤。有趣的是,如果我以它C (y).f ()或類似的C (static_cast<B*> (y))方式編寫它,它將按預期進行編譯。當然,最好的現代解決方法是{}在構造函數調用中使用。因此,正如我在之后發現的那樣,可以像這樣int (x) = 0;或什至聲明變量,int (((x))) = 0;但是我從未見過有人實際使用過這樣的聲明。因此,我很感興趣-這種可能性的目的是什么,因為到目前為止,我看到它只會創建類似于臭名昭著的“最令人煩惱的分析”的案例,并且沒有添加任何有用的信息?
查看完整描述

4 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

分組。

作為一個特定的示例,請考慮您可以聲明一個函數類型的變量,例如

int f(int);

現在,您將如何聲明一個指向此類事件的指針?

int *f(int);

不,不行!這被解釋為函數returning int*。您需要添加括號以使其以正確的方式進行解析:

int (*f)(int);

同樣處理數組:

int *x[5];   // array of five int*int (*x)[5]; // pointer to array of five int


查看完整回答
反對 回復 2019-09-26
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

通常允許在此類聲明中使用括號,因為從語法的角度來看,聲明總是像這樣:

<front type> <specification>;

例如,在以下聲明中:

int* p[2];

“ front type”是int(不是int*),“ specification”是* p[2]

規則是,您可以根據需要在“規格”部分中使用任意數量的括號,因為有時不可避免地要消除歧義。例如:

int* p[2]; // array of 2 pointers to int; same as int (*p[2]);int (*p)[2]; // pointer to an array of 2 ints

指向數組的指針很少見,但是與指向函數的指針相同:

int (*func(int)); // declares a function returning int*int (*func)(int); // declares a pointer to function returning int

這是您問題的直接答案。如果您的問題是關于的聲明C(y),則:

  • 在整個表達式中(C(y))加上括號- 您將得到想要的

  • 該語句除了創建一個臨時對象外什么都不做,在該指令結束后,該對象將不再存在(我希望這是您要執行的操作)。


查看完整回答
反對 回復 2019-09-26
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

正如我提到的,起初它是在析構函數中執行某些操作,我猜這是相當標準的事情,因為您有一些用于設置某些參數然后在析構函數中完成所有工作的“鏈接”功能。不過,感謝您提供另一種解決方法,我想寫作{}畢竟是最有效的一種方法。

查看完整回答
反對 回復 2019-09-26
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

盡量避免自己編寫語法,并使用標準中提供的語法。<front-type> <specification>是誤導和錯誤的。語法是<declaration-specifier> <declarator>

查看完整回答
反對 回復 2019-09-26
  • 4 回答
  • 0 關注
  • 918 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號