这将是我在这里发布的第一个问题,如果有什么问题,请告诉我。
所以我得到了这段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循环吗?
发布于 2015-11-16 16:35:50
我认为这是您实际上想要使用逗号运算符的情况之一:
while (randIdx = rand() % 3 , strlen(array[randIdx]) >= 27))
;以便既执行赋值又忽略其结果。
我会做一个笔记,它是这样的,所以没有人会试图在未来“纠正”它。
这也是一个好主意,让有意为空的循环看起来像是故意的,或者在它自己的行上使用分号,或者更明确:
while (randIdx = rand() % 3 , strlen(array[randIdx]) >= 27))
{
/* Empty loop */
}发布于 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:
while(!(randIdx = rand() % 3) || (strlen(array[randIdx]) >= 27));只要randIdx为0或长度为>= 27,这就会继续生成新的随机值。
实际上,只有randIdx = [2] strlen = [6]可以通过。
发布于 2015-11-16 14:55:33
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]));
}
}也许你可以修改你的代码。
https://stackoverflow.com/questions/33729737
复制相似问题