C++ 当在循环之外时是否可能中断循环?
在尝试进行while(bool)循环后,由于向量中没有任何内容而无法看到向量的内容,因此失败了,我进行了while(true)循环,目的是在用户输入0时中断。下面是代码的重要部分 编辑:工作代码,但|=意味着什么C++ 当在循环之外时是否可能中断循环?,c++,C++,在尝试进行while(bool)循环后,由于向量中没有任何内容而无法看到向量的内容,因此失败了,我进行了while(true)循环,目的是在用户输入0时中断。下面是代码的重要部分 编辑:工作代码,但|=意味着什么 #include "std_lib_facilities.h" class Name_pairs { public: vector<string>names; vector<double>ages; bool test
#include "std_lib_facilities.h"
class Name_pairs
{
public:
vector<string>names;
vector<double>ages;
bool test();
string read_names();
double read_ages();
void print();
};
string Name_pairs::read_names()
{
string name;
cout << "Enter name: ";
cin >> name;
names.push_back(name);
return name;
}
double Name_pairs::read_ages()
{
double age;
cout << "Enter corresponding age: ";
cin >> age;
ages.push_back(age);
cout << endl;
return age;
}
void Name_pairs::print()
{
for(int i = 0; i < (names.size()-1) && i < (ages.size()-1); ++i)
cout << names[i] << " , " << ages[i] << endl;
}
bool Name_pairs::test()
{
if(ages.empty() || names.empty()) return true;
if(ages.back() = 0 || names.back() == "0"){
return false;}
return true;
}
int main()
{
Name_pairs np;
cout << "Enter names and ages. Use 0 to cancel.\n";
bool finished = false;
while(!finished){
finished |= "0" == np.read_names();
finished |= 0 == np.read_ages();}
np.print();
keep_window_open();
}
#包括“std_lib_facilities.h”
类名\u对
{
公众:
矢量名称;
矢量;
布尔检验();
字符串read_names();
双读本();
作废打印();
};
字符串名称\u对::读取\u名称()
{
字符串名;
姓名;
名称。推回(名称);
返回名称;
}
双名双对::read_ages()
{
双倍年龄;
年龄;
年龄。推回(年龄);
cout您可以简单地使每个函数返回bool,然后在循环中检查函数是否返回false。如果是,则中断
你也可以从函数内部抛出一个错误,从外部捕获并适当地处理它,但我认为这有点极端。我得到的印象是,你只是在寻找一个“退出代码”类型的东西。如果是这样的话,我建议你只需返回一个bool并检查是否应该跳出循环
编辑:所以您的更新代码似乎有点复杂,但这就是我返回bool的意思:
void Name_pairs::read_names()
{
cout << "Enter name: ";
cin >> name;
names.push_back(name);
}
bool Name_pairs::read_ages()
{
cout << "Enter corresponding age: ";
cin >> age;
if ( age == 0 )
return false;
ages.push_back(age);
cout << endl;
return true;
}
// Now we can test if its time to break.
while ( true )
{
np.read_names();
if ( !np.read_ages() )
break;
}
void Name_pairs::read_names()
{
姓名;
名称。推回(名称);
}
bool Name_pairs::read_ages()
{
年龄;
如果(年龄==0)
返回false;
年龄。推回(年龄);
cout您可以简单地使每个函数返回bool,然后在循环中检查函数是否返回false。如果是,则中断
你也可以从函数内部抛出一个错误,从外部捕获并适当地处理它,但我认为这有点极端。我得到的印象是,你只是在寻找一个“退出代码”类型的东西。如果是这样的话,我建议你只需返回一个bool并检查是否应该跳出循环
编辑:所以您的更新代码似乎有点复杂,但这就是我返回bool的意思:
void Name_pairs::read_names()
{
cout << "Enter name: ";
cin >> name;
names.push_back(name);
}
bool Name_pairs::read_ages()
{
cout << "Enter corresponding age: ";
cin >> age;
if ( age == 0 )
return false;
ages.push_back(age);
cout << endl;
return true;
}
// Now we can test if its time to break.
while ( true )
{
np.read_names();
if ( !np.read_ages() )
break;
}
void Name_pairs::read_names()
{
姓名;
名称。推回(名称);
}
bool Name_pairs::read_ages()
{
年龄;
如果(年龄==0)
返回false;
年龄。推回(年龄);
cout您可以让函数返回一个值,然后检查该值,必要时中断
您也可以在调用函数后检查已读入的值。在这种情况下,如果(names.back()=“something”)或(ages.back()=“0”)可以工作,则类似于这样做
编辑:
您的总体想法是好的(在循环的每次迭代中运行test(),如果满足退出条件,则返回false),但是有几个实现错误:
if(ages[bool_counter] = 0 || names[bool_counter] == "0")
对于第一个条件,您需要“==”而不是“=”。我打赌您的编译器警告过您这一点,您通常应该听他的警告:)。您当前的语句正在将0分配给年龄[0],而没有检查它是否为0
您还应该在尝试取消引用第一个元素之前检查大小,否则,正如您所指出的,如果年龄或名称为空,则会出现错误
所以把它改成
if( (ages.size() > 0 ) && (ages.back() == 0)) ||
(names.size() > 0) && (names.back() == "0"))
应该可以工作,不过为了清晰起见,我更喜欢deus的响应。您可以让函数返回一个值,然后检查该值,必要时中断
您也可以在调用函数后检查已读入的值。在这种情况下,如果(names.back()=“something”)或(ages.back()=“0”)可以工作,则类似于这样做
编辑:
您的总体想法是好的(在循环的每次迭代中运行test(),如果满足退出条件,则返回false),但是有几个实现错误:
if(ages[bool_counter] = 0 || names[bool_counter] == "0")
对于第一个条件,您需要“==”而不是“=”。我打赌您的编译器警告过您这一点,您通常应该听他的警告:)。您当前的语句正在将0分配给年龄[0],而没有检查它是否为0
您还应该在尝试取消引用第一个元素之前检查大小,否则,正如您所指出的,如果年龄或名称为空,则会出现错误
所以把它改成
if( (ages.size() > 0 ) && (ages.back() == 0)) ||
(names.size() > 0) && (names.back() == "0"))
应该行得通,不过为了清楚起见,我更喜欢deus的回答。如果年龄/姓名为空,您可以显式地签入测试()
,并且只有当姓名不为空时才进行“真实”检查:
bool Name_pairs::test() {
if (ages.empty() || names.empty())
return true;
return (ages.back() != 0) && (names.back() != "0");
}
如果年龄
/名称
为空,则可以显式签入test()
,并且只有在名称不为空时才执行“真实”检查:
bool Name_pairs::test() {
if (ages.empty() || names.empty())
return true;
return (ages.back() != 0) && (names.back() != "0");
}
如果你改变问题,把它颠倒过来看,它就会变得非常简单
更改setter方法以实际返回刚输入的值。我还将age设置为该方法的局部变量,以防止副作用蔓延:
Double Name_pairs::read_ages()
{
Double age;
cout << "Enter corresponding age: ";
cin >> age;
ages.push_back(age);
cout << endl;
return age;
}
由于您在main中设置退出条件(键入0以退出),因此最好在那里测试退出条件的一致性
这就是我的看法……代码更短,更容易理解
编辑我将代码更改为反映注释aem。通过这种方式使用正确的逻辑运算符。对于级联计算,如果第一个答案为0,则第二个问题甚至不会被问(完成后计算为true,因此or语句的其余部分将不会被计算)因此,你必须注意这一点(例如,如果你希望两个向量始终具有相同的长度)。然而,我发现可用性是明智的,因为用户已经表示他想退出,所以我认为问他其他问题没有用。如果你改变问题并将其颠倒过来看,问题就变得非常简单
更改setter方法以实际返回刚输入的值。我还将age设置为该方法的局部变量,以防止副作用蔓延:
Double Name_pairs::read_ages()
{
Double age;
cout << "Enter corresponding age: ";
cin >> age;
ages.push_back(age);
cout << endl;
return age;
}
因为你正在设定你的目标