如果没有嵌套的do-while,循环不能按预期运行

时间:2011-03-07 14:25:03

标签: c++

我写了下面的代码来改组一副牌:

int i,j;  
for(int x=1;x<53;x++) {
   i=rand()%4;  
   j=rand()%13;  
   if(deck[i][j]=0)  
       deck[i][j]=x;
   else
       x--;
}  

这没有产生任何结果,而以下代码产生了结果:

int i,j;  
for(int x=1;x<53;x++) {
    do {
        i=rand()%4;  
        j=rand()%13;
    } while(deck[i][j]!=0);  
    deck[i][j]=x   
}  

这有什么不同?

6 个答案:

答案 0 :(得分:7)

我没有完全看你的逻辑,但是if(deck[i][j]=0)闻起来像是一个问题。您的意思是if(deck[i][j]==0)吗?

编辑现在看着它,我不确定你是如何得到答案的。底部循环是选择一个随机的i和j值,并确保deck[i][j]为0(或我猜是NULL)。当它为[i] [j]找到NULL值时,它会将x分配给它。

在你的循环中,如果deck [i] [j]不为null,则递减x(假设你的意思是==,我认为你这样做了)。底部循环不会触及身体内部的任何位置 - 仅在for条件下。你为什么决定递减x?

答案 1 :(得分:5)

问题是,在你的

if(deck[i][j]=0)  

你使用=而你必须使用==

赋值运算符(=)的结果是对指定对象的引用,在这种情况下,它是对deck[i][j]的引用,您只需将其设置为0.因此,就像您编写if(0)一样或if(false)。这就是你的if代码永远不会执行的原因。 HTH

* 请注意,在C ++中我们有std::random_shuffle函数,该函数位于<algorithm>标题*

答案 2 :(得分:4)

if(deck[i][j]=0)不是比较,请使用==

(它现在是一个赋值,并且始终为false - (a=b)的值为b,在这种情况下,b为0,0为false)

答案 3 :(得分:0)

替换

if(deck[i][j]=0) //assigns 0 to deck[i][j]

这一行

if(deck[i][j]==0)

答案 4 :(得分:0)

由于使用赋值而不是比较,您的第一个循环将永远继续。 “if”将始终评估为false(遗憾的是,int很容易降级为bool),因此x将每个循环递减到原来的位置。

在任何情况下,虽然这是一种非常低效的混乱方式,因为你以后会遇到很多碰撞。你应该做的是从0到x中选择一个随机数,x减少,然后用未洗过的包开始,将下一个空白空间换成位于该位置的卡。

即:

从包含52个空格的包开始,其中位置0保持0,位置1保持1等。

选择0到51(含)之间的数字。 无论出现什么数字,交换51号位置(即51位)的内容。例如,如果你得到17,将17放入单元格51并将51移动到单元格17中。

现在从0到50选择一个数字。用位置50等交换它

答案 5 :(得分:0)

if(deck[i][j]=0)  

这就是问题所在。你想写==

这就是为什么有些指南建议人们应该将其写成,

if( 0 == deck[i][j] )  

因为在编译时会发现意外错误。我的意思是如果你错误地写=而不是==,代码甚至都不会编译!