![](/img/trans.png)
[英]when c++ return true / false if the data type is integer or double value
[英]double as true / false
Bjarne建議使用if的條件作為范圍限制。 特別是這個例子。
if ( double d = fd() ) {
// d in scope here...
}
我很想知道如何在對/錯的意義上解釋聲明。
編輯:建議使用6.3.2.1 C ++編程語言。
Edit2:templatetypedefs的指針建議,尤其是動態轉換時,可能會為Bjarnes的建議提供見識。
SteveJessop告訴我:-條件不是表達式,也可以是聲明,使用的值是要求值的值。
您所看到的代碼是一種專用技術,用於在if
語句中聲明變量。 您通常會看到以下內容:
if (T* ptr = function()) {
/* ptr is non-NULL, do something with it here */
} else {
/* ptr is NULL, and moreover is out of scope and can't be used here. */
}
一個特別常見的情況是在此處使用dynamic_cast
:
if (Derived* dPtr = dynamic_cast<Derived*>(basePtr)) {
/* basePtr really points at a Derived, so use dPtr as a pointer to it. */
} else {
/* basePtr doesn't point at a Derived, but we can't use dPtr here anyway. */
}
您的情況是在if
語句中聲明了一個double
。 C ++自動將任何非零值解釋為true
並將任何零值解釋為false
。 該代碼的意思是“聲明d
並將其設置為等於fd()
。如果它不為零,則執行if
語句。”
就是說,這是一個非常糟糕的主意,因為double
會受到各種舍入錯誤的影響,在大多數情況下,防止它們變為0。 除非function
非常完善,否則這段代碼幾乎可以肯定會執行if
語句的主體。
希望這可以幫助!
在Stroustrup給出的示例中, if
塊中的代碼將值除以d
:
if (double d = prim(true)) {
left /= d;
break;
}
除以0是未定義的行為,因此在這種情況下 ,在除之前先將d
與值0.0
進行測試是有意義的。 由於Stroustrup指出的原因,將定義置於條件中是一種方便的方法。
您的代碼沒有給出為什么值0.0
會是特殊的原因,因此不清楚為什么有人會將d
的定義與該測試結合在一起。 僅在需要特別對待要定義的類型的“假”值時,才使用Stroustrup的模式。 否則,只需執行以下操作:
{
double d = fd();
// d in scope here...
}
if
語句基於在賦值表達式中分配給變量的值。 如果double計算除0.0以外的任何值,它將在其中運行代碼。
請注意,您不應該將雙精度數與零進行比較,但是根據我的經驗,它通常是有效的。
基本上,您不應該這樣做。
該主題的其他貢獻者還發現,此表達式用於排除零的情況,以避免被零除。 這絕對是明智的,就我而言,這種情況使這種用法合法化(但請考慮這樣的代碼可能引起的混亂)。
它既是一個聲明又是一個雙重聲明。 這相當於
{
double d = fd();
if (d) {
}
}
但是,此模式值得使用一些小的附加語法來簡化,因為它相當有用且通用。 另外,一旦開始添加else子句,轉換就不太明顯了,因為d
在它們的范圍之外。
另外,正如其他人指出的那樣,它通常很有用,但是與0相比,特定的FP類型存在一些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.