我最近遇到了一個很少重現的bug。如果我因爲某種原因拋出一個不爲BOOL的指針,我得到NO!11我知道BOOL是signeddef的signed char。這可能是一個問題嗎?不是BOOL的投影指針返回NO
回答
如果指針的形式0xNNNNNN00
或(64位)0xNNNNNNNNNNNNNN00
,其中N
是任何十六進制數字,然後強制轉換爲BOOL
(一unsigned char
)會留下0
,因爲它會截斷所有的非零位。
的指針正確地轉換爲BOOL
,使用不等於運算符:
BOOL isNotNull = (myPointer != NULL);
你能告訴我「if(obj)」將obj轉換爲什麼類型? – 2011-05-06 12:06:05
您可以像通過不等式運算符轉換爲「BOOL」在實踐中,根據系統的指令集可能會或可能不會這樣做。 '如果(aPointer)'應該總是正常工作。 :) – 2011-05-06 12:14:16
它是因爲一個指針是32位大而char只是8位。所以當從一個指針轉換爲char時,它將修剪24位。所以其餘8位只是零的可能性非常高,特別是當指針地址很高時。
你可以做的是:
BOOL myBool = (myPointer != NULL); // This will evaluate if the pointer is true (>0) or false (NULL)
哦,只需幾秒鐘。 – 2011-05-06 11:56:59
@Jonathan:對不起,它不會再發生。承諾:P – JustSid 2011-05-06 12:00:28
BOOL
不應該使用,因爲這確切原因類型。事實上,我可以想象使用一個布爾類型變量(而不是僅僅使用原始值,指針或其他類型的變量),除非在巨型位數組中需要特殊代碼來解決位。如果您確實需要布爾類型,請使用C99 _Bool
(或中的bool
),它具有正確的轉換語義而不是模256縮減。
- 1. Php popen只返回bool(true)而不是指針
- 2. 如何將指向BOOL的指針返回112?
- 3. C++ Bool不使用指針返回true或false
- 4. 目標C - BOOL投零或NO
- 5. 數組投影爲長指針?
- 6. 確保返回值不是指針
- 7. ArrayList.get()返回指針不是值?
- 8. 返回指針數組的指針
- 9. 返回指針數組的指針
- 10. std :: get_temporary_buffer返回的是原始指針而不是智能的指針
- 11. 返回一個空當返回類型不是指針
- 12. Closure返回其引用/指針而不是返回值
- 13. Mongodb投影返回給定的位置
- 14. mongodb的find()返回的對象是否缺少指定投影中的字段?
- 15. 指針不會返回指定地址
- 16. 返回指針C
- 17. 返回指針Ç
- 18. 返回alloca指針
- 19. C++返回指針
- 20. 返回類指針
- 21. 指針與返回
- 22. 投射指針
- 23. isEqualToString總是返回NO /假
- 24. NSURL isFileURL總是返回NO
- 25. 「FBDialogs canPresentShareDialogWithPhotos」總是返回NO
- 26. 返回指針數組(CvSeq指針)
- 27. 投指針的指針作爲LPVOID *
- 28. malloc的不斷返回同一指針
- 29. 的Android:this.getApplication()返回NULL指針
- 30. MongoDB(Mgo v2)投影返回父結構
對於後代,你會介意包括如何投射到BOOL的例子嗎?使用'(BOOL)var'? – 2011-05-09 20:09:35
是的,就是這樣。 – 2011-05-11 16:33:33
是的。我希望能給出錯誤的結果。但我也希望只是'BOOL b = var;'能夠工作;如果沒有,我會有很多代碼來修復。 :) – 2011-05-16 21:31:53