C++ 如果没有嵌套的do while,For循环的行为将不符合预期

C++ 如果没有嵌套的do while,For循环的行为将不符合预期,c++,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--; } inti,j; 对于(intx=1;x我没有充分考虑您的逻辑,但是if(deck[I][j]=0)闻起来像个问题。您是说if(deck[I][j]=0) EDIT现在查看它,我不确定您是如何得

我编写了以下代码来洗牌:

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--;
}  
inti,j;

对于(intx=1;x我没有充分考虑您的逻辑,但是
if(deck[I][j]=0)
闻起来像个问题。您是说
if(deck[I][j]=0)

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

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

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


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

问题是,在

if(deck[i][j]=0)  
您使用=而您必须使用==

赋值运算符(=)的结果是对赋值对象的引用,在本例中,它是对
deck[i][j]
的引用,您刚刚将其设置为0。因此,它就像您编写了
if(0)
if(false)
。这就是为什么您的if代码从未执行。hth

*<强>作为一个旁注,请注意,在C++中,我们有函数在<代码> <代码>头> */强>

< p>替换

if(deck[i][j]=0) //assigns 0 to deck[i][j]
用这条线

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

由于使用赋值而不是比较,您的第一个循环将永远继续。如果“if”将始终计算为false(遗憾的是,int太容易退化为bool),因此x将减回到每个循环原来的位置

在任何情况下,洗牌都是一种非常低效的方式,因为你以后会遇到很多冲突。你应该做的是从0到x选择一个随机数,x递减,然后在开始使用非缓冲包装后,用位于该位置的卡交换下一个空位

i、 e:

从一个有52个空格的包开始,位置0容纳0,位置1容纳1,以此类推

从0到51(含)之间选择一个数字。 无论出现什么数字,将其与位置51(即51)中的数字进行交换。例如,如果得到17,将17放入单元格51,将51移至单元格17

现在选择一个从0到50的数字。将其与位置50互换,以此类推

if(deck[i][j]=0)  
这就是问题所在。您想编写
==

这就是为什么一些指导方针建议将其写为

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

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

您所说的没有产生任何结果是什么意思?您期望的是什么,实际发生的是什么?
如果(deck[I][j]=0)
是一个赋值,因此始终为真,请使用比较运算符
==
,然后再次检查。@sled,你的意思是“因此始终为假”吗?@Rob Adams:明白了!零赋值返回零,因此为假
if( 0 == deck[i][j] )