在while循环中使用逻辑和运算符的奇怪行为

时间:2015-11-16 06:42:07

标签: c while-loop logical-operators

这是我在这里发布的第一个问题,如果出现任何问题,请告诉我。

所以我得到了这段C代码:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(int argc, char const* argv[]) {
    char array[3][50] = {
        "theoretical computer science",
        "programming puzzles and code golf",
        "ebooks"
    };
    int randIdx = 0;
    srand(time(NULL));

    int i;
    for (i=0; i<10; i++) {
        // discard everything longer than 27
        while((randIdx = rand() % 3) && (strlen(array[randIdx]) >= 27));

        printf("outside while: randIdx = [%d]\tstrlen = [%ld]\n",
                randIdx, strlen(array[randIdx]));
    }

}

Since the order of the logical and operator is left to right,我希望空的while循环能够丢弃第一个和第二个数组成员。但是,程序的输出(循环10次)如下所示:

outside while: randIdx = [2]    strlen = [6]
outside while: randIdx = [0]    strlen = [28]
outside while: randIdx = [0]    strlen = [28]
outside while: randIdx = [0]    strlen = [28]
outside while: randIdx = [2]    strlen = [6]
outside while: randIdx = [2]    strlen = [6]
outside while: randIdx = [2]    strlen = [6]
outside while: randIdx = [2]    strlen = [6]
outside while: randIdx = [0]    strlen = [28]
outside while: randIdx = [0]    strlen = [28]

知道为什么randIdx = [0] strlen = [28]可以逃脱while循环吗?

5 个答案:

答案 0 :(得分:1)

我认为这是您实际上希望使用逗号运算符的情况之一:

while (randIdx = rand() % 3 , strlen(array[randIdx]) >= 27))
    ;

以便执行赋值并忽略其结果。

我会注意到它的意思是那样的,所以没有人会在将来试图“纠正”它。

将故意空循环看起来是有意的,或者使用分号在自己的行上,或者更明确地使用分号,这也是一个好主意:

while (randIdx = rand() % 3 , strlen(array[randIdx]) >= 27))
{
    /* Empty loop */
}

答案 1 :(得分:0)

这是因为只要条件是真实的,while语句就会循环。在randIdx == 0&amp; strlen(array[randIdx]) < 27,表达式为false(0),while循环停止。

因此,如果您只想让randIdx randIdx != 0的{​​{1}}值,您可以反转逻辑并使用 < em>逻辑OR 代替:

strlen(array[randIdx]) < 28

只要while(!(randIdx = rand() % 3) || (strlen(array[randIdx]) >= 27)); 为0 OR 长度> = 27,这将继续生成新的随机值。

实际上,只有randIdx会通过。

答案 2 :(得分:0)

   for (i=0; i<10; i++) 
   {
        // discard everything longer than 27
        while((randIdx = rand() % 3) && (strlen(array[randIdx]) < 27))
        {
            printf("outside while: randIdx = [%d]\tstrlen = [%ld]\n", randIdx, strlen(array[randIdx]));
        }
    }

也许你可以修改你的代码。

答案 3 :(得分:0)

您的;循环后面有一个分号(while)。除了更改randIdx的值之外,使while循环不做任何事情。您应该将代码更改为:

for (i=0; i<10; i++) {

    // discard everything longer than 27
    while((randIdx = rand() % 3) && (strlen(array[randIdx]) >= 27)) {
        printf("outside while: randIdx = [%d]\tstrlen = [%ld]\n",
            randIdx, strlen(array[randIdx]));
    }

}

答案 4 :(得分:0)

while((randIdx = rand()%3)&amp;&amp;(strlen(array [randIdx])&gt; = 27));

randIdx = [0] strlen = [28]的情况下,如果检查while循环内的条件,则randIDX等于0。 这意味着(0&amp;&amp; 1)----&gt;这里为strlen(array [randIdx])= 28返回1,大于27。

因此我相信这回答了问题

  

为什么randIdx = [0] strlen = [28]可以转义while循环?