如何在 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) { /* ... */ }

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

关于大肠杆菌:http://coliru.stacked-crooked.com/a/3c2c05950274388e

如果你想修复你的代码,请自己进行每个比较(使用 strcmp 用于 char*char[],简单比较用于 std::string),然后合并布尔运算符的结果 (&& || !).