Это будет первый вопрос, который я публикую здесь, пожалуйста, сообщите мне, если что-то не так.Странное поведение с логическим и оператором в цикле while
Так я получаю этот кусок кода 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, я надеялся, что пустое время цикла будет иметь возможность отказаться от первого и второго элемента массива. Тем не менее, выход программы (петельные 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' цикла есть что-то делать это. –
Вы спрашиваете, почему while цикл прекращается, когда условие ложно ....... может быть потому, что 'strlen = [28]' dosent удовлетворяют второму условию 'And'' strlen (array [randIdx])> = 27'. – wrangler
@wrangler - Вы правы, я допустил ошибку и не понял: (randIdx = rand()% 3) 'равно' (randIdx = rand()% 3)! = 0'. Пустое тело было предназначено пропустить элемент randIdx, который указывает на элементы массива дольше 27. – user224234