我有2个不同的代码,对我来说看起来相同,但事实并非如此。第一个按照我的意愿起作用,第二个不做。我不明白为什么。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
int num1, num2, num3, i=0;
srand(time(0));
do{
i++;
num1=rand()%3+1;
num2=rand()%3+1;
num3=rand()%3+1;
cout<<i<<"."<<num1<<num2<<num3<<endl;
}while(!((num1==1)&&(num2==2)&&(num3==3)));
}
这是第二个。据我所知,do-wher lile循环应运行,直到num1不等于1,num2不等于2,num3不等于3。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
int num1, num2, num3, i=0;
srand(time(0));
do{
i++;
num1=rand()%3+1;
num2=rand()%3+1;
num3=rand()%3+1;
cout<<i<<"."<<num1<<num2<<num3<<endl;
}while((num1!=1)&&(num2!=2)&&(num3!=3));
}
问题在这里: while(((num1==1)&&(num2==2)&&(num3==3)));
当这三个都与您打印的值不同时,循环将结束。我也强烈建议学习布尔算术,尤其是德·摩根定律
!(a&amp;&amp; b)=!a ||!b!(a || b)=!a&amp;&amp;!b so
!((num1==1)&&(num2==2)&&(num3==3))
将转换为
(!(num1==1)||!(num2==2)||!(num3==3))
两个代码之间的区别是,第一个代码将迭代直到所有三个变量符合其各自的条件,但是第二个代码将持续到至少一个变量符合其状况。这就是使用布尔逻辑评估时出现的方式。如果您想在不使用开始的情况下纠正第二个条件!,则可以将条件更改为:
while((num1 != 1) || (num2 != 2) || (num3 != 3));
在第一个程序中的do-语句中的条件
while(!((num1==1)&&(num2==2)&&(num3==3)));
可以等效地转换为
while( (num1!=1) || (num2!=2) || (num3 != 3)));
这意味着其中一个变量中的一个不等于1或2或3。
第二个程序中的do-while语句中的条件
}while((num1!=1)&&(num2!=2)&&(num3!=3));
表示NUM1不等于1,NUM2不等于2,NUM3不等于3。
。很明显条件
while( (num1!=1) or (num2!=2) or (num3 != 3)));
和
}while( (num1!=1) and (num2!=2) and (num3!=3));
不同。
因此,程序的行为不同。:)