1

我在理解 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;这应该做什么?(如果我删除它,结果是一样的)

谢谢

4

3 回答 3

3

C 有一条规则,“任何为零的东西”都是假的,其他的都是真的。所以当你写if(x)它的时候if (x != 0)if(!x)意思是一样的if (x == 0)

和-中for的条件相同。whiledowhile

所以你的代码:

do
{
    ball = rand() % RANGE; /* Generate the random ball */
}
while(numbers[ball] != 0);

我假设这numbers是一个 50 的数组,用零填充 [如果它是静态存储持续时间,那么如果没有其他说明,它会自动设置为零。]

当一个数字被绘制时numbers[ball] = 1;,将该数字设置为非零,所以如果我们再次绘制相同的数字,do-while 循环将再次循环并选择另一个数字[我们希望 - 如果随机数生成器真的很垃圾,它可能变成无限循环]

于 2013-02-12T19:04:30.050 回答
1
for(c=0; c<50; c++) {
    do {
        ball = rand() % RANGE;
    } while(numbers[ball]);

    numbers[ball] = 1;
    printf("%2d ", ball + 1);
}

如果我们要删除 line: numbers[ball] = 1;,那么 ball 在主for循环的多次迭代中可能具有相同的值。这将导致程序报告 50 个数字,就像以前一样,除了现在,可以有重复


至于while循环中的条件,这两行是等价的。

1. do { ... } while(numbers[ball]);
2. do { ... } while(numbers[ball] != 0);

如果使用更具描述性的变量名称,这也会更好。特别是,numbers更准确地标记为already_selected_balls

于 2013-02-12T19:07:35.743 回答
0

看到你ball = rand() % RANGE;生成的数字在 0 到 9 之间(你的 Range 是 10),最初的 numbers 数组被初始化为零,表示到目前为止没有绘制任何数字。

现在随机语句选择一个数字(也可能为零)然后while(numbers[ball])检查该数字是否已经绘制(0 为假,其他一切为真),最初每个都是 0,所以 do-while 循环将停止,我们设置numbers[ball] = 1;为表示号码球已被使用,现在程序打印ball+1(因为球也可以为0,我们不希望球号为零)

假设首先选择了数字 5(并且打印了 6),现在假设rand()再次生成 5,这将满足 while(numbers[5] 为 1)do-while 的条件再次运行,直到找到一个从未使用过的数字(表示由数字[球]为零)

基本上该ball+1语句是可选的,因为代码编写者不希望球号为 0

于 2013-02-12T19:19:07.673 回答