for循环后的分号是什么意思?为什么在第一循环语句中有一个j ++?

时间:2019-04-23 16:14:29

标签: c++ for-loop

我需要基于优先级队列实现自己的Dijkstra算法版本,并且在搜索一些有关该站点的站点时,我看到了一种确实有效的算法,但带有奇怪的for循环语句:

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] && (d[j] < d[u]))   //d[i] is table of distances
            u = j;
    QS[u] = true;

    //some code
}

我知道循环后的;表示它是空语句,但是如果我再评论for-loop,该程序将停止工作,因此实际上意味着某些事情。我相信这个u = j++的意思就像是起始表格u = j+1,但我不确定。

3 个答案:

答案 0 :(得分:4)

for(j = 0; QS[j]; j++);用作j=0; while(QS[j])j++;

即查找QS[j]为假的第一个j

答案 1 :(得分:1)

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

j设置为0,然后递增j直到QS中的第一个元素为假。然后,将该值用作第三个循环的初始值。

这是一种切肉刀的书写方式,但是您可以像使用std::findstd::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] && (d[j] < d[u]))   //d[i] is table of distances
            u = j;
    QS[u] = true;

    //some code
}

其中明确指出j是从数组开头到第一个false元素的距离。

答案 2 :(得分:0)

第二个for循环遍历所有数组QS 布尔数组。当一个为假时,它将中断,保存j的当前值,并从该值+1开始下一个循环。