簡體   English   中英

在基於范圍的for循環中使用雙/整數和縮小數據

[英]Double/Integer use and data narrowing within a Range-Based for loop

我正在通過Bjarne Stroustrup的編程原則和實踐工作,我遇到了困難。 我目前正在閱讀Vector,並已介紹到基於范圍的for循環。 下面我有一些代碼,從我的眼睛看,似乎正在閱讀一個雙重進入INT; 我認為這會導致縮小范圍。

int main()
{
    vector<double> temps;               // temperatures
    for (double temp; cin >> temp; )    // read into temp
        temps.push_back(temp);          // put temp into vector
                                        // compute mean temperature:
    double sum = 0;
    for (int x : temps) sum += x;
        cout << "Average temperature: " << sum / temps.size() << '\n'; 
                                        // compute median temperature:
    sort(temps);                        // sort temperatures
    cout << "Median temperature: " << temps[temps.size() / 2] << '\n';
    keep_window_open();
    return 0;
}

在嘗試了幾次不同的輸入后,我得出結論,這確實在縮小。 我正在創建一個雙精度矢量,而不是for(int x:temps)循環,將第一個元素放在temp中,將它放在x中,處理它而不是遞增到下一個元素並重復。 因為元素(雙精度)被讀入x(整數),導致變窄。

我的主要問題是,如果我確實是正確的,它正在縮小向量中的元素(可能它實際上沒有讀入x並且int x正在描述其他內容),我可以簡單地將(int x:temps)替換為for (double x:temps)以避免這種縮小,或者是在基於范圍的for循環參數中強制使用整數(可能是這樣設計的)。 有任何想法,謝謝。

這是一個縮小的轉換,是( C ++標准的第11.6.4節[dcl.init.list], 7.1項)。 我猜這是一種錯誤的類型。 假裝它說double x (如果你已經知道auto關鍵字,則auto x ,這使得編譯器在可能的情況下推斷出類型)。

我在第2版勘誤表中找不到這個。 我實際上放棄了Stroustrup教授的一句話並問他(不要害羞 - 你可以看到,這本書有一堆錯誤,他應該感謝這個問題)。

  1. 是的,您可以使用任何類型來初始化for循環變量(它的任何版本)。
  2. 是的,在C / C ++中從浮點類型到整數類型的任何轉換 ,總是返回此數字的截斷值( floor操作)。

請看一下 C ++的轉換規則:

如果轉換是從浮點類型轉換為整數類型,則會截斷該值(刪除小數部分)。 如果結果位於類型的可表示值范圍之外,則轉換會導致未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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