在使用cin时,是否有必要将一个变量存储两次

Is it necessary to store a variable twice when using cin?

本文关键字:一个 存储 两次 变量 cin 是否      更新时间:2023-10-16

我正在学习"加速C++",并将我对章末练习的回答与此处的答案进行了比较。在创建行和列填充的用户输入时,我写道:

int colpad;
cout << "Please enter the number of columns to pad: ";
cin >> colpad;
int rowpad;
cout << "Please enter the number of rows to pad: ";
cin >> rowpad;

然后在函数的剩余部分继续使用rowpad和colpad。这对我有效。

然而,上面网站解决方案的作者做了我所做的,然后添加了(为了清晰起见,更改了变量名称(:

const int rowpad = inrowpad; // vertical padding
const int colpad = incolpad; // horizontal padding

他的解决方案同样有效。我的问题是:我应该第二次将colpad和rowpad的值作为常量存储吗?这不仅会占用额外的内存吗?

没有必要将值存储到const版本中。使用const对象可以防止意外更改,并且在函数中,如果编译器能够确定用于初始化const对象的变量不更改,则可能不会使用额外的内存。

顺便说一句,代码在另一方面是错误的:您应该始终在读取后验证读取操作是否成功:

if (!(std::cin >> colpad)) {
    // deal with the read failure
}

额外的内存将是微不足道的,编译器无论如何都可以对其进行优化,但const的使用稍微减少了出错的机会。

不过,我想知道在同一范围内为同一事物增加两个变量的复杂性是否值得。

我更愿意将非常数变量提取到一个单独的函数中:

int getInt() {
  int in;
  if(cin >> in)
    return in;
   ...  // handle errors
}
cout << "Please enter the number of columns to pad: ";
const int colpad = getInt();
cout << "Please enter the number of rows to pad: ";
const int rowpad = getInt();

然后主作用域中只有一个变量,它还有一个额外的好处,即代码重复减少了一点。

使用const是保护输入值不受以后更改影响的好方法。考虑到您提供的网站上的示例程序,没有理由添加新的常量变量,而且在执行过程中会额外消耗几个字节的代码空间和内存。

如果以后要将变量或指针传递给其他函数,可以考虑使用const来保护指针和引用。但是,做这个例子并没有害处,你的问题是正确的。

还要直接回答你的主题:不,没有必要。

这样的构造通常在编译过程中被"优化掉"。这意味着,在二进制程序中,通常会有一个变量的副本。

因此,只要你没有对非恒定空间复杂性的结构(数组、树、图…(进行不必要的复制,你就不应该担心一两个额外的变量。

我可以定义一个函数,而不是两个变量:

int getIntFromUserInput()
{
    int inputValue(0);
    std::cin >> inputValue;
    return inputValue;
}

其可以如下使用:

std::cout << "Please enter the number of columns to pad: ";
const int numColumnsToPad(getIntFromUserInput());
std::cout << "Please enter the number of rows to pad: ";
std::const int numRowsToPad(getIntFromUserInput());

这样,您就可以将输入的结果存储为const,而不必担心不必要的内存使用。