如何在 while 语句中设置多个条件? (c++)
How can I have multiple conditions in a while statement? (c++)
一个while语句可以有3个条件吗?
例如:
cout << "\n\nHow would you like your parcel shipped?\n (please type standard, express"
" or same day)" << endl;
cin >> method;
while (method != ("standard" && "express" && "same day"))
{
cout << "invalid input: please follow the instructions carefully.." << endl;
cout << "\n\nHow would you like your parcel shipped?\n (please type 'standard',"
" 'express' or 'same day')" << endl;
cin >> method;
}
我问的原因是,当我 运行 这段代码时,它进入了一个无限循环,我无法理解为什么。
while (method != "standard" && method != "express" && method != "same day")
是:
cout << "\n\nHow would you like your parcel shipped?\n (please type standard, express or same day)" << endl;
cin >> method;
while (method != "standard" && method != "express" && method != "same day")
{
cout << "invalid input: please follow the instructions carefully.." << endl;
cout << "\n\nHow would you like your parcel shipped?\n (please type 'standard', 'express' or 'same day')" << endl;
cin >> method;
}
是的,这个有效:
while (condition && condition && condition) { }
理论上,您可以链接尽可能多的条件 like/need。
不是你展示的那样,不是。每个条件都必须单独测试:
while ((method != "standard") && (method != "express") && (method != "same day"))
是的,这是可能的;你只需要做对:
while (method != "standard" && method != "express" && method != "same day")
{
// do whatever
}
眼前的问题只是在
method != ("standard" && "express" && "same day")
&&
运算符应用于指向字符的指针,这些字符被转换为 bool
就像它们与空指针进行比较一样(这是对任何基本的 bool
的一般转换值v,即v!= 0
)。因为它们都是非空的,所以括号部分的结果是 true
。通过 !=
将其与 method
进行比较可能无法编译,具体取决于 method
.
的类型
如果 method
是一个std::string
…
那么可以直接和字符串字面量比较,把条件写成
not (method == "standard" or method == "express" or method == "same day")
但请注意,如果 method
是原始数组,这将不起作用(另请注意:对于 Visual C++ 包含 <iso646.h>
,例如通过强制包含,以便使标准 not
编译).
通常更好的表达条件的方法是使用一组值,并检查该组中的成员资格。
现在,显示的代码,
cout << "\n\nHow would you like your parcel shipped?\n (please type standard, express or same day)" << endl;
cin >> method;
while (method != ("standard" && "express" && "same day"))
{
cout << "invalid input: please follow the instructions carefully.." << endl;
cout << "\n\nHow would you like your parcel shipped?\n (please type 'standard', 'express' or 'same day')" << endl;
cin >> method;
}
被称为 循环和半 ,在循环结束时重复一些代码,在循环之前。
仍然假设method
是一个std::string
,你可以这样重组它:
for( ;; )
{
cout << "\n\nHow would you like your parcel shipped?\n (please type 'standard', 'express' or 'same day')" << endl;
cin >> method;
if( method == "standard" or method == "express" or method == "same day" )
{
break;
}
cout << "invalid input: please follow the instructions carefully.." << endl;
}
while (method != "standard" && method != "express" && method != "same day")
while (method != ("standard" && "express" && "same day")) { /* ... */ }
所有这些字符串文字在遇到布尔值时计算为 true
,因为它们在数组衰减后不是 NULL
(这导致指向其第一个元素的指针)(NULL
保证不同于任何对象的地址)。
因此,循环等价于:
while (method != true) { /* ... */ }
我不太明白的是,为什么您的编译器不会大声抱怨这种比较,无论 method
是 char*
、char[]
还是 std::string
.
也许您应该要求符合标准和警告?
-Wall -Wextra -pedantic -std=c++14
是一个好的开始。
关于大肠杆菌:http://coliru.stacked-crooked.com/a/3c2c05950274388e
如果你想修复你的代码,请自己进行每个比较(使用 strcmp
用于 char*
或 char[]
,简单比较用于 std::string
),然后合并布尔运算符的结果 (&&
||
!
).
一个while语句可以有3个条件吗?
例如:
cout << "\n\nHow would you like your parcel shipped?\n (please type standard, express"
" or same day)" << endl;
cin >> method;
while (method != ("standard" && "express" && "same day"))
{
cout << "invalid input: please follow the instructions carefully.." << endl;
cout << "\n\nHow would you like your parcel shipped?\n (please type 'standard',"
" 'express' or 'same day')" << endl;
cin >> method;
}
我问的原因是,当我 运行 这段代码时,它进入了一个无限循环,我无法理解为什么。
while (method != "standard" && method != "express" && method != "same day")
是:
cout << "\n\nHow would you like your parcel shipped?\n (please type standard, express or same day)" << endl;
cin >> method;
while (method != "standard" && method != "express" && method != "same day")
{
cout << "invalid input: please follow the instructions carefully.." << endl;
cout << "\n\nHow would you like your parcel shipped?\n (please type 'standard', 'express' or 'same day')" << endl;
cin >> method;
}
是的,这个有效:
while (condition && condition && condition) { }
理论上,您可以链接尽可能多的条件 like/need。
不是你展示的那样,不是。每个条件都必须单独测试:
while ((method != "standard") && (method != "express") && (method != "same day"))
是的,这是可能的;你只需要做对:
while (method != "standard" && method != "express" && method != "same day")
{
// do whatever
}
眼前的问题只是在
method != ("standard" && "express" && "same day")
&&
运算符应用于指向字符的指针,这些字符被转换为 bool
就像它们与空指针进行比较一样(这是对任何基本的 bool
的一般转换值v,即v!= 0
)。因为它们都是非空的,所以括号部分的结果是 true
。通过 !=
将其与 method
进行比较可能无法编译,具体取决于 method
.
如果 method
是一个std::string
…
那么可以直接和字符串字面量比较,把条件写成
not (method == "standard" or method == "express" or method == "same day")
但请注意,如果 method
是原始数组,这将不起作用(另请注意:对于 Visual C++ 包含 <iso646.h>
,例如通过强制包含,以便使标准 not
编译).
通常更好的表达条件的方法是使用一组值,并检查该组中的成员资格。
现在,显示的代码,
cout << "\n\nHow would you like your parcel shipped?\n (please type standard, express or same day)" << endl;
cin >> method;
while (method != ("standard" && "express" && "same day"))
{
cout << "invalid input: please follow the instructions carefully.." << endl;
cout << "\n\nHow would you like your parcel shipped?\n (please type 'standard', 'express' or 'same day')" << endl;
cin >> method;
}
被称为 循环和半 ,在循环结束时重复一些代码,在循环之前。
仍然假设method
是一个std::string
,你可以这样重组它:
for( ;; )
{
cout << "\n\nHow would you like your parcel shipped?\n (please type 'standard', 'express' or 'same day')" << endl;
cin >> method;
if( method == "standard" or method == "express" or method == "same day" )
{
break;
}
cout << "invalid input: please follow the instructions carefully.." << endl;
}
while (method != "standard" && method != "express" && method != "same day")
while (method != ("standard" && "express" && "same day")) { /* ... */ }
所有这些字符串文字在遇到布尔值时计算为 true
,因为它们在数组衰减后不是 NULL
(这导致指向其第一个元素的指针)(NULL
保证不同于任何对象的地址)。
因此,循环等价于:
while (method != true) { /* ... */ }
我不太明白的是,为什么您的编译器不会大声抱怨这种比较,无论 method
是 char*
、char[]
还是 std::string
.
也许您应该要求符合标准和警告?
-Wall -Wextra -pedantic -std=c++14
是一个好的开始。
关于大肠杆菌:http://coliru.stacked-crooked.com/a/3c2c05950274388e
如果你想修复你的代码,请自己进行每个比较(使用 strcmp
用于 char*
或 char[]
,简单比较用于 std::string
),然后合并布尔运算符的结果 (&&
||
!
).