我是 C++ 的初级程序员(目前),我有一个概念性问题。
我正在尝试过滤 cin
输入以确保它是 01-04 之间的一位或两位整数,如果不是,则产生错误并要求新的输入。
我还使用 map
为用户提供选项列表,根据有效 选择,通过多种方法中的任何一种路由输入(整数)以生成相关结果,但我会在其他地方询问这个问题的更具体版本。
我在 http://www.cplusplus.com/forum/beginner/26821/ 找到了一段代码那是为了验证输入。我有点明白,除了在 while 循环中设置 boolean 条件的地方。因为我不理解它,所以很难编辑或确保我正确地操作它。
示例代码如下:
int main()
{
int num;
bool valid = false;
while (!valid)
{
valid = true; //Assume the cin will be an integer.
cout << "Enter an integer value: " << endl;
cin >> num;
if(cin.fail()) //cin.fail() checks to see if the value in the cin
//stream is the correct type, if not it returns true,
//false otherwise.
{
cin.clear(); //This corrects the stream.
cin.ignore(); //This skips the left over stream data.
cout << "Please enter an Integer only." << endl;
valid = false; //The cin was not an integer so try again.
}
}
cout << "You entered: " << num << endl;
system("PAUSE");
return 0;
这是我的代码(完整的代码,以提供上下文)。我不认为它是完整的,我只是想确保我使用的是正确的 boolean 值。
float _tmain(float argc, _TCHAR* argv[])
{
bool validInput = !true;
map<string,int> Operations;
Operations.insert(pair<string, int>("Addition", 01));
Operations.insert(pair<string, int>("Subtraction", 02));
Operations.insert(pair<string, int>("Multiplication", 03));
Operations.insert(pair<string, int>("Division", 04));
cout << "Welcome to OneOpCalc, what operation would you like to perform?" << endl;
for(map<string, int>::iterator ii=Operations.begin(); ii!=Operations.end(); ++ii)
{
cout << (*ii).second << ": " << (*ii).first << endl;
}
while (!validInput)
{
cin >> operatorSelection;
if (cin.fail() || operatorSelection < 4 || operatorSelection > 1)
{
cout << "Error: Invalid selection. Please choose a valid number." << endl << endl;
cin.clear();
cin.ignore();
}
}
}
while (!valid)
是指“当 valid
为 false 时”吗?在我的脑海里,它在说“虽然 valid
是 !valid
”,但显然,这永远是错误的。
编辑:感谢大家的回答,我正在仔细查看。我不断得到的一个答案过于笼统;我明白那个 !不是,我理解使用它翻转 bool 的概念。然而,隐含的逻辑含义让我感到困惑。在任何给定的语句中,我习惯于将 !valid
视为翻转 valid
值的一种方式;不测试条件。这是使用它来测试欺骗我的条件的语法。换句话说,编写 while(!valid)
对我来说是字面上的 while(NOTvalid)
,而不是 while(valid==false)
。我无法让自己理解为什么在这种情况下,!valid
被视为一个条件,而不仅仅是位翻转。
最佳答案
循环(和 ifs)由 bool
类型的表达式控制.
在 while ( !valid )
, 表达式为 !valid
, 运营商
未应用于变量的值 valid
.
while ( !valid )
表示(字面意思)而表达
!valid
(这意味着“无效”)是真的。
对于其余部分,您正在复制的代码非常糟糕。我不会 如果我是你,就以它为例。
至于你自己的代码:
_tmain
对微软来说非常特别。你不想 用它。如果您编写控制台应用程序,只需使用main
. (同样的事情适用于_TCHAR
,而不是char
。)都不是
_tmain
也不main
可以返回float
.返回main
的类型应始终为int
.我不太熟悉_tmain
, 但它要么是int
或void
. (可能是int
,如果 你在控制台模式程序中。)!true
是false
.总是。 (编程不同于 现实世界。没有可能。)为什么要更多 比必要的复杂?根本不需要标志变量。你 可以只写:
cin >> 运算符选择; while (!cin || operatorSelection > 4 || operatorSelection < 1) { //...
如果出现错误,您目前只会忽略一个 特点。您可能想要忽略直到并包括 行结束。 (
std::cin.ignore( std::numeric_limits<std::streamsize>::max() );
.并且您的 if 中的条件将始终为真。 (见我的 上面的版本。)你希望在哪里找到一个数字 既不小于也不大于 1?
关于c++ - 你能解释一下 bool 如何控制循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18129174/