这是我在这里发布的第一个问题,如果出现任何问题,请告诉我。
所以我得到了这段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循环吗?
答案 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循环?