是否可以在while语句中包含三个条件?
例如:
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;
}
我问的原因是,当我运行此代码时,它进入无限循环,我无法理解为什么。
答案 0 :(得分:5)
while (method != "standard" && method != "express" && method != "same day")
答案 1 :(得分:3)
直接问题就在于
method != ("standard" && "express" && "same day")
&&
运算符应用于指向字符的指针,这些字符转换为bool
,就好像它们与空指针进行比较一样(对于任何基本值,这是对bool
的一般转换< em> v ,即 v != 0
)。由于它们都是非空的,因此括号部分的结果为true
。将method
与!=
进行比较可能无法编译,具体取决于method
的类型。
如果 method
是std::string
...
然后你可以直接将它与字符串文字进行比较,并将条件写为
not (method == "standard" or method == "express" or method == "same day")
但要注意,如果method
是一个原始数组,这将不起作用(另请注意:对于Visual C ++包含<iso646.h>
,例如通过强制包含,以便生成标准{{1}编译)。
表达条件的一般更好的方法是使用一组值,并检查该集合中的成员资格。
现在,显示的代码
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
答案 2 :(得分:2)
while (method != "standard" && method != "express" && method != "same day")
答案 3 :(得分:2)
while (method != ("standard" && "express" && "same day")) { /* ... */ }
所有这些字符串文字在满足布尔值时都会求值为true
,因为它们在数组衰减后不是NULL
(导致指向第一个元素的指针)(NULL
得到保证与任何对象的地址不同。)
因此,循环等同于:
while (method != true) { /* ... */ }
无论method
为char*
,char[]
还是std::string
,我的编译器都不会对该比较大声抱怨。
也许您应该要求标准合规和警告?
-Wall -Wextra -pedantic -std=c++14
是一个好的开始。
关于coliru:http://coliru.stacked-crooked.com/a/3c2c05950274388e
如果您想修复代码,请为自己进行每次比较(对strcmp
或char*
使用char[]
,对std::string
进行简单比较),然后合并结果使用布尔运算符(&&
||
!
)。
答案 4 :(得分:1)
不是你表现出来的方式,没有。每个条件都必须单独测试:
while ((method != "standard") && (method != "express") && (method != "same day"))
答案 5 :(得分:1)
是的,这是可能的;你只需要做对:
while (method != "standard" && method != "express" && method != "same day")
{
// do whatever
}
答案 6 :(得分:0)
是:
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;
}
答案 7 :(得分:0)
是的,这有效:
while (condition && condition && condition) { }
理论上,你可以根据自己的需要链接任意数量的条件。