我有一个问题是理解C中的“do - while”语句。
以下是完整的代码:http://pastebin.com/uPRvRscd
该程序生成6个数字,范围从0到50。 6个数字中没有一个重复。
这是do-while循环:
for(c=0;c<BALLS;c++)
{
/* See if a number has been allready been drawn */
do
{
ball = rand() % RANGE; /* Generate the random ball */
}
while(numbers[ball]); /* How is this compare made ? */
/* Number drawn */
numbers[ball] = 1; /* What is this for ?!? */
printf("%2d ", ball+1); /* add 1 to ball so ball won't be zero */
}
逻辑比较如何运作?
我知道DO取决于WHILE是真还是假。
numbers[ball] = 1;
这应该是做什么的? (如果我删除它,结果是相同的)
谢谢
答案 0 :(得分:3)
C有一条规则,即“零的任何东西”都是假的,其他一切都是真的。因此,当您撰写if(x)
时,它与if (x != 0)
相同,if(!x)
表示if (x == 0)
。
for
,while
和do
- while
中相同的机智条件。
所以你的代码确实如此:
do
{
ball = rand() % RANGE; /* Generate the random ball */
}
while(numbers[ball] != 0);
我假设numbers
是一个50的数组,它填充为零[如果它是静态存储持续时间,那么如果没有其他说明,它会自动设置为零。]
当一个数字被绘制时numbers[ball] = 1;
将该数字设置为非零,所以如果我们再次绘制相同的数字,do-while循环将再次循环并选择另一个数字[我们希望 - 如果随机数字生成器真的很垃圾,它可能会变成无限循环]
答案 1 :(得分:1)
for(c=0; c<50; c++) {
do {
ball = rand() % RANGE;
} while(numbers[ball]);
numbers[ball] = 1;
printf("%2d ", ball + 1);
}
如果我们要删除行:numbers[ball] = 1;
,那么在主for
循环的多次迭代中,球可能具有相同的值。这将导致程序报告50个数字,就像之前一样,除了现在, CAN 是重复的。
对于while循环中的条件,这两行是等价的。
1. do { ... } while(numbers[ball]);
2. do { ... } while(numbers[ball] != 0);
如果使用更具描述性的变量名称,这也可能更好。特别是,numbers
更准确地标记为already_selected_balls
。
答案 2 :(得分:0)
看到你的ball = rand() % RANGE;
生成0到9之间的数字(你的范围是10)
最初数字数组初始化为零,表示到目前为止没有绘制数字。
现在随机语句选择一个数字(也可能是零)然后通过while(numbers[ball])
检查是否已经绘制了该数字(0为假,其他一切都为真),最初每个都为0所以do-while循环将停止,我们设置numbers[ball] = 1;
表示已经使用了数字球,现在程序打印ball+1
(因为球也可以是0,我们不希望球数是零)
假设首先选择了数字5(并且打印了6),现在假设rand()
再次生成5,这将满足while(数字[5]为1)do-while再次运行直到找到的条件从未使用的数字(用数字[ball]表示为零)
基本上ball+1
语句是可选的,因为代码编写者不希望球号为0