[英]null pointer in C++
大家好,我對C ++有一些疑問,你真的喜歡用什么
int* var = 0;
if(!var)...//1)
or
if(var == 0)..//2)
優缺點都有什么? 提前致謝
我更喜歡if (!var)
,因為那時你不會意外地分配給var
,而你不必在0
和NULL
之間選擇。
我一直被教導使用if (!var)
,似乎我讀過的所有慣用的C(++)都遵循這一點。 這有一些很好的語義:
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)){...} 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.