#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
*/
看看上面的简单程序,您会认为这将是一个无限循环,但由于某种原因它会运行一次并结束。将运算符从&&更改为||陷入无限循环。
就好像&&和||运算符被交换。我只是看不到吗?
答案 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。但是无论如何,您都应该学习如何使用调试器。