在opencv中看到這樣一段代碼
#define CV_Assert( expr ) do { if(!!(expr)) ; else cv::error( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ ); } while(0)
1、為什么要用do{}while()把代碼包起來?有什么用?
如果是為了限制作用域,直接加{}行不?
2、if(!!(expr)) ;這句代碼有什么意義? !!不就等于本身嗎
里面好多帶判斷的宏定義都是這樣寫的,為什么?
uj5u.com熱心網友回復:
加粗代碼部分是同一行,自動換行了。。。。uj5u.com熱心網友回復:
1.直接使用 {} 會有這樣的問題
if(exp)
CV_Assert( expr );
else
......
這里 else 找不到對應的if
使用do{}while(0) 就沒有這個問題
2. !!exp不等于本身 比如exp本身是2 !!exp結果是1
uj5u.com熱心網友回復:
do()while{0}; 作用是讓你無論咋個騷操作就能當成一個整體。uj5u.com熱心網友回復:
看本貼下面紅色字體對應鏈接uj5u.com熱心網友回復:
第1個懂了,謝謝
第2個,懂了取兩次!的作用,就是把非0的任何數轉換為1
但是這樣轉換有意義嗎,對于if來說非0就相當于1。不管是2,3,4...跟最后轉換為1之后對于判斷來說是沒有區別的啊
uj5u.com熱心網友回復:
對于if是沒區別
這里這樣寫只是好看
如果用在其他地方還是有作用的
比如 -1 * !!exp 之類的運算式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242593.html
標籤:C++ 語言
上一篇:Boost 庫里有沒有 決議算式的庫?這種 2+3*4-5
下一篇:怎么發帖啊?
