簡體   English   中英

加倍為真/假

[英]double as true / false

Bjarne建議使用if的條件作為范圍限制。 特別是這個例子。

if ( double d = fd()  ) {
   // d in scope here...
}

我很想知道如何在對/錯的意義上解釋聲明。

  1. 這是一個宣言
  2. 這是雙重的。

編輯:建議使用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.

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