簡體   English   中英

在代碼中聲明常量或使用數字

[英]Declaring constants or using numbers inside the code

所以,我有這個C ++測試,老師很難聲明常量,而不是直接在代碼中使用數字。 在下面的例子中,我甚至將ZERO聲明為常量。

這是不必要的還是這是一件好事? 這種方式會占用更多內存還是使代碼“變慢”?

int main() {

    int kmStart, kmEnd;
    const int ZERO = 0;

    cout << "Starting Kms? ";
    cin >> kmStart;

    cout << "Ending Kms? ";
    cin >> kmEnd;

    while (kmStart < ZERO || kmStart > kmEnd) {
        cout << "Invalid Input!" << endl << endl;

        cout << "Starting Kms? ";
        cin >> kmStart;

        cout << "Ending Kms? ";
        cin >> kmEnd;
    }

}

constexpr int ZERO = 0; 幾乎肯定會完全編譯出來。

請注意新的關鍵字constexpr ,從C ++ 11開始。

對於你當前的代碼, ZERO可能被編譯出來,但即使它沒有任何性能下降也可以忽略不計。 輸入/輸出功能。

我想知道為什么你的老師認為ZERO0更清楚。 當他們看到0時,每個人都知道他們正在處理什么。 例如, ZERO可能意味着'0' ,甚至是"0" ,它們是完全不同的野獸:在調試時,你總是要檢查代碼。

對於長壽命應用程序的開發,必須使用正確命名的常量。 管理普通的數字文字很快就會失控。 請考慮以下示例:

foo(42);
bar(42);

它有幾個問題:

  • 無法猜測42值來自何處
  • 不可能猜測兩個函數調用中的42是巧合還是我們故意傳遞相同的值
  • 由於我們需要手動識別我們想要調整的特定值的所有位置,因此前一點改變程序行為可能具有挑戰性

如果您的應用程序包含數百個文件,那將是一個字面上的噩夢。

因此,如果使用常量,則可能會變為示例代碼段

constexpr int const fast_foobing_rate{42};
constexpr int const slow_barring_coeff{42};

foo(fast_foobing_rate);
bar(slow_barring_coeff);

要么

constexpr int const days_in_week_count{7};
constexpr int const frobbing_weeks_count{6};
inline constexpr int get_frob_repetitions_count(void) noexcept
{
    return(days_in_week_count * frobbing_weeks_count);
}

foo(get_frob_repetitions_count());
bar(get_frob_repetitions_count());

所以現在:

  • 我們能夠追蹤價值的起源
  • 我們可以找到使用這些持久值的地方
  • 我們可以通過修改它們的定義來輕松調整這些持久值,我們的更改將自動應用於整個代碼庫

有了所有這些好處,我們就不會受到性能損失的影響。 根據常量類型,甚至可以為性能帶來一些好處。

通常,直接在代碼中使用常量而不是數字可以使代碼更易讀,更易於維護。

請考慮以下示例:

例如,你有一種時間為0.1秒的模擬,你需要在源代碼的不同位置使用這個時間步長值,那么使用它會更容易

const double timesstep = 0.1

而不是每個地方寫0.1。

優勢是:

  • 如果要更改時間步長的值,則只能更改一行
  • 如果你知道常量含義,代碼就會變得更具可讀性

但在你的情況下,我認為使用0而不是零更可讀,或者你將它重命名為更具表現力的東西,如“minimum_start”或類似的東西......

Personnaly,對於整數常量我使用枚舉(source == Scott Meyer,Effective C ++):

int main (int argc, char* argv []) {
  enum Constant {
    NTRY = 32,
    NEQ = 8,
    SMAX = 200000000,
    ALERT = 65536
  };

  size_t ntry (Constant::NTRY);
  std::cout << "ntry == " << ntry << std::endl;
  return 0;
}

暫無
暫無

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

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