簡體   English   中英

C ++中的空指針

[英]null pointer in C++

大家好,我對C ++有一些疑問,你真的喜歡用什么

int* var = 0;

if(!var)...//1)
or
if(var == 0)..//2)

優缺點都有什么? 提前致謝

我更喜歡if (!var) ,因為那時你不會意外地分配給var ,而你不必在0NULL之間選擇。

我一直被教導使用if (!var) ,似乎我讀過的所有慣用的C(++)都遵循這一點。 這有一些很好的語義:

  • 沒有意外的任務
  • 你正在測試某些東西的存在(即如果它是NULL)。 因此,您可以將語句讀作“如果var不存在”或“如果var未設置”
  • 如果var是布爾值,那么映射與你慣用的內容密切相關(bool在C中不可用,但人們仍然模仿它們的使用)
  • 與前一點類似,它與謂詞函數調用緊密相關,即。 if (!isEmpty(nodeptr)) { .. }

主要是個人偏好。 有人會建議第一個是首選,因為不可能意外分配而不是比較。 但是同樣的道理,如果你養成了將rvalue放在比較左邊的習慣,編譯器會在你吹它時抓住你:

if( 0 == var )

......這當然是真的。 我只是發現if( !var )是否更具表現力,更少打字。

他們都會評估相同,所以沒有運行時差異。 最重要的是你選擇一個並堅持下去 不要將一個與另一個混合。

幾年過去了......

C ++ 11標准引入了nullptr來檢查空指針,應該使用它,因為它確保比較實際上是在指針上完成的。 所以最強大的檢查是:

if(myPtr != nullptr)

!var的問題在於,如果var是布爾值或數值(int,byte等......),它將測試它們是否等於0。 如果你使用nullptr ,你確定你正在檢查指針而不是任何其他類型:

例如:

int valA = 0;
int *ptrA = &valA;

if(!valA) // No compile error
if(!*ptrA) // No compile error
if(!ptrA) // No compile error

if(valA != nullptr) // Compile error, valA is not a pointer
if(*ptrA != nullptr) // Compile error, *ptrA is not a pointer
if(ptrA != nullptr) // No compile error

因此,在示例中操作指向int的指針時很容易出錯,這就是為什么應該使用nullptr

任何一個都是好的,雖然我個人更喜歡2 - 或類似的東西。

讓我更有意義閱讀:

if ( ptr != NULL )

if ( ptr )

第二個我可能會因為只是一個布爾值而混淆,但第一個我能夠立刻告訴它它是一個指針。

無論哪種方式,我認為重要的是選擇一個並堅持這一點以保持一致性 - 而不是在整個產品中以不同的方式完成它。

我更喜歡選項3:

if(not var)
{
}

C ++的新(自1998年以來)運算符關鍵字有時可以使代碼更容易閱讀。

奇怪的是,它們似乎很不為人知。 似乎有更多的人知道什么是三字母(謝謝IOCCC!),而不是那些知道運算符關鍵字的人。 運算符關鍵字存在類似的原因:即使鍵盤不提供所有ANSII字符,它們也允許使用C ++編程。 但與trigraphs相反,運算符關鍵字使代碼更具可讀性而不是混淆代碼。

根據高完整性C ++編碼標准手冊: 為了比較常量和變量,您應該將常量放在左側以防止賦值而不是相等比較 ,例如:

Avoid:
if(var == 10) {...}

Prefer
if(10 == var) {...}

特別是在你的情況下,我更喜歡if(0 == var),因為很明顯你將指針比較為null(0)。 因為! 運算符可以重載然后它可能有其他含義,具體取決於指針指向的內容: if(!(* var)){...}

  1. 不要使用NULL,使用0。
  2. 嚴格來說,指針不是bool,所以使用'=='和'!='運算符。
  3. 永遠不要使用'if(ptr == 0)',而是使用'if(0 == ptr)'。
  4. 不要使用C指針,而是使用smart_ptr。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM