首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >while循环中逻辑and运算符的奇怪行为

问while循环中逻辑and运算符的奇怪行为
EN

Stack Overflow用户
提问于 2015-11-16 14:42:07
回答 5查看 151关注 0票数 0

这将是我在这里发布的第一个问题,如果有什么问题,请告诉我。

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

代码语言:javascript
复制
#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次)如下所示:

代码语言:javascript
复制
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循环吗?

EN

回答 5

Stack Overflow用户

发布于 2015-11-16 16:35:50

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

代码语言:javascript
复制
while (randIdx = rand() % 3 , strlen(array[randIdx]) >= 27))
    ;

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

我会做一个笔记,它是这样的,所以没有人会试图在未来“纠正”它。

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

代码语言:javascript
复制
while (randIdx = rand() % 3 , strlen(array[randIdx]) >= 27))
{
    /* Empty loop */
}
票数 1
EN

Stack Overflow用户

发布于 2015-11-16 14:49:21

这是因为只要条件为真,while语句就会循环。在randIdx == 0和strlen(array[randIdx]) < 27的情况下,表达式为false (0),并且while循环停止。

因此,如果您只想让randIdx值包含randIdx != 0和strlen(array[randIdx]) < 28,则可以颠倒逻辑,改用logical OR:

代码语言:javascript
复制
while(!(randIdx = rand() % 3) || (strlen(array[randIdx]) >= 27));

只要randIdx为0或长度为>= 27,这就会继续生成新的随机值。

实际上,只有randIdx = [2] strlen = [6]可以通过。

票数 0
EN

Stack Overflow用户

发布于 2015-11-16 14:55:33

代码语言:javascript
复制
   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]));
        }
    }

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33729737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档