C - сокращенно для цикла, выполняемого только один раз - PullRequest
2 голосов
/ 16 февраля 2010

У меня есть утилита командной строки, написанная на ANSI C на Mac с функцией создания массива с сортировкой по пузырькам для списка с одной ссылкой. Я объявил переменные цикла.

int a = 0;   
int b = 0;

Я написал пузырьковую сортировку для циклов в сокращенном стиле (то есть, оставив инициализацию переменной пустой).

for ( ; a < size; a++)  
  for( ; b < size; b++) 

Это выполняется только один раз перед выходом. Предыдущий цикл for, использующий переменную i для заполнения массива, был написан так же, как и ожидалось. Исправление для пузырьковых сортировочных циклов заключалось в том, чтобы вернуть значения a = 0 и b = 0. Существует ли причина, по которой сокращенное число циклов for не удалось выполнить?

Ответы [ 3 ]

11 голосов
/ 16 февраля 2010

Если вы пропустите b=0, внутренний цикл будет выполняться ровно один раз, потому что после этого b уже равно размеру. Вам нужно сбросить b на 0 на каждой итерации внутреннего цикла.

2 голосов
/ 16 февраля 2010

Почему вы хотите использовать то, что вы называете сокращенным стилем цикла for?

for loop - просто синтаксический сахар для цикла while ниже:

for (INIT ; ENDTEST ; STEP){
    DO_SOME_STUFF
}

означает

INIT
while (ENDTEST) {
 DO_SOME_STUFF
 STEP
}

Следовательно, ваши две петли делают:

int a = 0;
int b = 0;
while (a < size){
   while (b < size){
      DO_SOME_STUFF
      b++;
   }
   a++;
}

В этой форме вы можете легко увидеть, что инициализация b не выполняется там, где должна.

Все, что я мог бы сказать, это избегать использования сокращенных циклов for, удаление инициализации не лучше, чем удаление завершения теста или удаление шага цикла (оба также допустимы в C) - все это простые способы исправления ошибок в ваших программах. Только не делай этого.

1 голос
/ 16 февраля 2010

Другой цикл for для заполнения массива был написан так же, как и ожидалось.

Похоже, что это было до текущего цикла, и использовали те же переменные a и b.

И потом не сбрасывал их обратно в ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...