如何在while语句中包含多个条件? (C ++)

时间:2015-01-11 19:57:08

标签: c++ while-loop

是否可以在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;
}

我问的原因是,当我运行此代码时,它进入无限循环,我无法理解为什么。

8 个答案:

答案 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的类型。

如果 methodstd::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) { /* ... */ }

无论methodchar*char[]还是std::string,我的编译器都不会对该比较大声抱怨。
也许您应该要求标准合规和警告? -Wall -Wextra -pedantic -std=c++14是一个好的开始。

关于coliru:http://coliru.stacked-crooked.com/a/3c2c05950274388e

如果您想修复代码,请为自己进行每次比较(对strcmpchar*使用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) { }

理论上,你可以根据自己的需要链接任意数量的条件。