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

What does a semicolon after for-loop means? Why is there a j++ in first loop statement?

本文关键字:循环 第一个 为什么 语句 j++ 意思 是什么 for      更新时间:2023-10-16

我需要基于优先级队列实现我自己的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
}

我知道 ; after 循环意味着它是空语句,但是如果我在第二个for-loop发表评论,该程序就会停止工作,所以它实际上意味着什么。我相信这个u = j++应该是像u = j+1开始形式,但我不太确定。

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

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

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

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

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

这是一种切肉刀的编写方式,但您可以使用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 元素的距离。

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