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

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

是否使用GOTO?

是否使用GOTO?

C++
蕭十郎 2019-12-27 15:18:07
目前,我正在一個項目中大量使用goto語句。goto語句的主要目的是在例程中具有一個清理段,而不是多個return語句。如下所示:BOOL foo(){   BOOL bRetVal = FALSE;   int *p = NULL;   p = new int;   if (p == NULL)   {     cout<<" OOM \n";     goto Exit;   }   // Lot of code...Exit:   if(p)   {     delete p;     p = NULL;   }   return bRetVal;}這使工作變得更加容易,因為我們可以在代碼的一個部分(即在“退出”標簽之后)跟蹤清理代碼。但是,我讀過很多地方,使用goto語句是不好的做法。目前,我正在閱讀《代碼完成》一書,它說我們需要使用靠近其聲明的變量。如果使用goto,則需要在首次使用goto之前聲明/初始化所有變量,否則編譯器會給出錯誤消息,表明goto語句跳過了xx變量的初始化。哪種方法正確?從斯科特的評論:似乎使用goto從一個部分跳轉到另一部分是不好的,因為這會使代碼難以閱讀和理解。但是,如果我們僅使用goto前進并指向一個標簽,則應該很好(?)。
查看完整描述

3 回答

?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

我從未在C ++中使用過goto。曾經 永遠 如果有這種情況,應該使用它,這種情況非常罕見。如果您實際上正在考慮將goto作為您邏輯的標準部分,那么事情就已經發生了。


查看完整回答
反對 回復 2019-12-27
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

人們對于gotos和您的代碼基本上有兩點:

  1. 后藤很糟糕。 在一個需要使用goto的地方遇到這種情況非常罕見,但是我不建議您完全打敗它。盡管C ++具有足夠智能的控制流程,但很少適合使用goto。

  2. 您的清理機制是錯誤的:這一點更為重要。在C語言中,自己使用內存管理不僅可以,而且通常是做事的最佳方法。在C ++中,您的目標應該是盡可能避免內存管理。您應該盡可能避免內存管理。讓編譯器為您完成。而不是使用new,而只是聲明變量。真正需要內存管理的唯一時間是事先不知道數據大小的情況。即使那樣,您也應該嘗試僅使用某些STL集合。

如果您合法地需要內存管理(您尚未真正提供任何證據),則應該通過構造函數將內存管理封裝在一個類中以分配內存,而通過析構函數來取消分配內存。

從長遠來看,您對做事方式要容易得多的回答并不是真的。首先,一旦您對C ++有深刻的了解,使此類構造函數成為第二自然。就我個人而言,我發現使用構造函數比使用清理代碼更容易,因為我不需要仔細注意以確保我正確地進行了分配。取而代之的是,我可以讓對象離開范圍,而語言則由我自己處理。而且,維護它們比維護清理部分要容易得多,并且不容易出現問題。

簡而言之,goto在某些情況下可能是一個不錯的選擇,但在這種情況下則不是。這只是短期的懶惰。


查看完整回答
反對 回復 2019-12-27
  • 3 回答
  • 0 關注
  • 494 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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