避免两次写入相同条件的最干净的方法
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
}
假设我有一个从用户输入值的循环,如果该值等于零,它就会中断。
有没有办法不用写两次相同的条件就可以做到这一点?
例如:
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
}