避免两次写入相同条件的最干净的方法

Cleanest way to avoid writing same condition twice

假设我有一个从用户输入值的循环,如果该值等于零,它就会中断。

有没有办法不用写两次相同的条件就可以做到这一点?

例如:

int x;

do
{
    std::cin >> x;
    
    if (x)
    {
        //code
    }

} while(x);

最干净的方法是什么?

最简洁的方式(并注意它如何测试输入流的完整性)是

while (int x; std::cin >> x && x){
    // code
}

另一种为失败条件引入代码的方法是

for (;;){ // infinite loop idiom
    int x;
    if (std::cin >> x && x){
        // code
        continue; // i.e. go round again
    }
    // ToDo - code here?
    break;
};

是一种方式。这不符合每个人的口味,尽管循环体结束前的 break; 让人觉得循环不是 真的 无限。

还有一个好处就是x的范围不会泄露到外层范围

当您完全按照您用文字描述的方式编写代码时,它会变得更简单:

int x;

while(std::cin >> x) // I have a loop that inputs a value from user, and ...
{
    if(x == 0)       // if the value is equal to zero, ...
    {
        break;       // it breaks.
    }

    // do something with x ...
}

std::cin >> x;作为条件的原因是在输入无效输入或流结束时停止阅读。

Verbatim“一个从用户输入值的循环,如果该值等于零,它就会中断。”

while (true)
{
  std::cin >> x;
  if (x == 0)
    break;
  ...
}

怎么样:

int x;
while (std::cin >> x, x) {
    std::cout << x*5 << std::endl;
}

没有 ifs,没有 break,x 已经被 while 条件评估为 non-zero。

写一个小函数来读取值可能是最干净的,return 一个布尔值来指示您是否读取 non-zero 值,然后使用该函数:

bool read(int &x) { 
    std::cin >> x;
    return std::cin && (x != 0);
}

while (read(x)) {
    // code to process x
}