为什么这个else块被执行了两次?

时间:2017-09-22 07:49:27

标签: c for-loop if-statement

我有以下代码正确计算输入char array和现有char数组数组之间的jaccard相似性。 jacc_sim_rec[]用于记录满足最小阈值的相似性。 for循环用于遍历多维数组,如果if (jacc_sim < SIM_THRESHOLD);不满足最小阈值,则循环应继续检查相似性,否则记录结果

else
    {
        jacc_sim_rec[j] = jacc_sim;//keep record of similarity
        ++j;//record number of highly similar elements
    }

我的问题是,每次满足阈值时,else块中的所有语句都会执行两次。

int j=0;

void calc_jac_sim( char*INCOMING, int grp)
{
    unsigned long i, j11 = 0, j01 = 0, j10 = 0,m=0;
    char *m11, *m01, *m10;
    float jacc_sim = 0.0;
    char r1[SBF_LEN] = { NULL };
    char r2[SBF_LEN] = { NULL };
    char r3[SBF_LEN] = { NULL };
    int cnt = SBF_LEN - 1;

    clear_jacc_sim_info();

    for (int i = 0; i <= SBF_REC[grp]; ++i)
    {
        while (cnt >= 0)
        {
            r1[cnt] = SBF[grp][i][cnt] & INCOMING[cnt];
            r2[cnt] = ~SBF[grp][i][cnt] & INCOMING[cnt];
            r3[cnt] = SBF[grp][i][cnt] & ~INCOMING[cnt];
            cnt--;
        }
        m11 = ( char*)r1;
        m01 = ( char*)r2;
        m10 = ( char*)r3;

        for (m = SBF_LEN * sizeof( char); m--;
             j11 += NumberOfSetBits(*m11++),
                 j01 += NumberOfSetBits(*m01++),
                 j10 += NumberOfSetBits(*m10++));

        jacc_sim = j11 / (float)(j11 + j01 + j10);

        if (jacc_sim < SIM_THRESHOLD);
        //continue;//do nothing
        else
        {
            jacc_sim_rec[j] = jacc_sim;//keep record of similarity
            ++j;//record number of highly similar elements
        }
    }

}

1 个答案:

答案 0 :(得分:1)

我不理解代码,但我敢打赌,问题是你不是每次都通过cnt循环重新初始化for,所以你只填写{{1} r1时的{},r2r3

将该循环更改为:

i = 0

我也不确定为什么这需要倒数而不是像典型的循环一样,但它不应该有所作为。