声明常数或在代码中使用数字

Declaring constants or using numbers inside the code

本文关键字:数字 代码 常数 声明      更新时间:2023-10-16

所以,我有这个C 测试,而老师确实很难声明常数,而不是直接在代码中使用数字。在下面的示例中,我什至将零声明为常数。

这是不必要的还是这是一件好事?这种方式是否占用更多内存或使代码"慢"?

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。

优势是:

  • 如果要更改值,则只能更改一行timestep
  • 如果您知道常数含义
  • ,则代码变得更加可读

但是,就您而言,我认为使用0而不是零更可读,或者将其重命名为" Minimum_start"或类似的内容...

personaly,对于整数常数,我正在使用枚举(source == Scott Meyer,有效的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;
}
相关文章: