&&和||操作员未按预期工作

时间:2019-03-06 08:53:05

标签: c++

#include <iostream>
#include <string>

using namespace std;

int main(){
    char c1;
    char c2 = 'B';

    while(c1 != 'B' && c2 == 'B'){

        cout << "Ok!" << endl;

        c1 = 'B';
        //c2 = 'A';

        cout << "c1 = " << c1 << endl << "c2 = " << c2 << endl;
    }
}

/*
    >>OUTPUT<<

    Ok!
    c1 = B
    c2 = B
*/

看看上面的简单程序,您会认为这将是一个无限循环,但由于某种原因它会运行一次并结束。将运算符从&&更改为||陷入无限循环。

就好像&&和||运算符被交换。我只是看不到吗?

2 个答案:

答案 0 :(得分:3)

c1尚未初始化,因此可能不是'B',即c1 != 'B'可能为true。

因此,由于您在循环主体中将c1设置为'B',因此该循环从统计上讲可能只运行一次,当然最多只能运行一次。

(请注意,通常,读取未初始化的变量的行为是 undefined ,但是char类型是明显的例外。)

答案 1 :(得分:3)

&&是AND,||是OR

可以找到操作符列表here,并且可以找到每个操作符的更详细的解释,包括优先级顺序here

您的程序第一次到达循环c1时是未初始化的,其读取的值为undefined,可能不是'B',但可以是任何东西。因此,c1 != 'B'在大多数情况下都为真。 因此,c1 != 'B' && c2 == 'B'的整个语句为true && true,循环运行一次。

  

注意:读取未初始化的值是“未定义的行为”。从技术上讲,这会使您的整个应用程序变得不确定,因此无效。但是“未定义行为”可以做任何事情,在这种情况下,返回的值不为“ B”,或者将来可能返回的值为“ B”,或者只是崩溃。

在循环中,您设置了c1 = 'B',因此while循环c1 != 'B'中的第一个条件变为假,然后整个条件为false && true。 由于false AND true = false,因此循环中止。

如果用或(||换出and和,则循环将始终运行,因为c2 == 'B'将始终为true,因为您无需在循环中进行更改。

您应该learn how to use a debugger并逐步执行代码,并在每个步骤之后检查变量。对于像这样的非常简单的问题,“ printf-debugging”也适用。只需将您感兴趣的变量和表达式的内容转储到stdout。但是无论如何,您都应该学习如何使用调试器。