Что означает точка с запятой после for-loop? Почему в первом операторе цикла есть j ?

#c #for-loop

#c #for-loop

Вопрос:

Мне нужно реализовать свою собственную версию алгоритма Дейкстры на основе очередей приоритетов, и при поиске на некоторых сайтах об этом я увидел алгоритм, который действительно работает, но со странными операторами for-loop:

 int i,j,n;
cin >> n;   //number of vertexes
bool *QS = new bool [n];

//whole QS is set to false here

for(i = 0; i < n; i  ) {
    for(j = 0; QS[j]; j  );
    for(u = j  ; j < n; j  )
        if(!QS[j] amp;amp; (d[j] < d[u]))   //d[i] is table of distances
            u = j;
    QS[u] = true;

    //some code
}
  

Я знаю, что ; после цикла это означает, что это пустой оператор, но если я прокомментирую второй, for-loop эта программа перестанет работать, так что это действительно что-то значит. Я считаю, что это u = j должно было быть похоже на начальную форму u = j 1 , но я не так уверен.

Комментарии:

1. Разместите ссылку на сайт. Этот первый цикл for ничего не делает.

2. после того, как пустой цикл j укажет на первый индекс QS , который равен false.

3. @fdan Нет, этого не произойдет, потому что массив, на который указывает QS, никогда не инициализируется, и поэтому у нас есть UB .

4. @NeilButterworth есть комментарий, в котором говорится, что «весь QS здесь имеет значение false»

5. eduinf.waw.pl/inf/alg/001_search/0138.php Это на польском языке, поэтому я не думаю, что это было бы полезно

Ответ №1:

for(j = 0; QS[j]; j ); используется как j=0; while(QS[j])j ;

т.Е. Найти первое j, которое QS[j] равно false

Ответ №2:

 for(j = 0; QS[j]; j  );
  

устанавливает j в 0, а затем увеличивает j до тех пор, пока первый элемент в QS не станет false. Затем вы используете это значение для начального значения третьего цикла.

Это простой способ его написания, но вы можете быть намного более выразительными в отношении того, что он делает, используя std::find и std::distance подобные

 for(i = 0; i < n; i  ) {
    int j = std::distance(std::begin(QS), std::find(std::begin(QS), std::end(QS), false));
    for(u = j  ; j < n; j  )
        if(!QS[j] amp;amp; (d[j] < d[u]))   //d[i] is table of distances
            u = j;
    QS[u] = true;

    //some code
}
  

в котором явно указано, что j будет расстояние от начала массива до первого элемента false.

Ответ №3:

второй цикл for проходит через весь массив QS, который является массивом логических значений. Который прерывается, когда значение равно false, сохраняя текущее значение j и начиная следующий цикл с этого значения 1.