{for“

时间:2019-12-07 15:52:27

标签: c database loops for-loop

我有一个代码,可以根据数据库ID从数据库中提取数据。

当我对条件使用循环时,if条件被忽略,即使相等,代码也始终运行。

我制作了两个示例,显示了for的用法,另一个示例仅显示了check。

使用if仅检查,代码有效,但是我需要使用for,因为DB有很多条目。

数据库条目:

0,2115
1,604
2,254
3,425
4,321
5,98
6,15001
...

代码:

int use_sm(struct session *ss, int n) {
    struct db_sm *sm = sm->database(ss->get_sm);

    if (!sm)
        return 1;

    if (sm->enable && sm->count_db > 0) {
        struct get_dfs *gf = ss->data[n];

        if (gf) {
            for (int i = 0; i < sm->count_db; i++) {
                if(gf->u_id != sm->db[i].u_id) { //code is running even though ==
                    printf("u_id %d db_u_id %d\n", gf->u_id, sm->db[i].u_id);
                    sm->use_sm_sub(sm, 5);
                    return 0;
                }
            }
        }
    }
    return 1;
}

代码,如果:

int use_sm(struct session *ss, int n) {
    struct db_sm *sm = sm->database(ss->get_sm);

    if (!sm)
        return 1;

    if (sm->enable && sm->count_db > 0) {
        struct get_dfs *gf = ss->data[n];

        if (gf) {
            if (gf->u_id != sm->db[0].u_id && gf->u_id != sm->db[1].u_id && gf->u_id != sm->db[2].u_id && gf->u_id != sm->db[3].u_id) {
                printf("u_id %d u_id1 %d u_id2 %d u_id3 %d u_id4 %d\n", gf->u_id, sm->db[0].u_id, sm->db[1].u_id, sm->db[2].u_id, sm->db[3].u_id);
                sm->use_sm_sub(sm, 5);
                return 0;
            }
        }
    }
    return 1;
}

使用 if 条件的代码可以正常工作。 如果验证 gf-> u_id 的值为 == sm-> db [x] .u_id 该代码未执行。

for循环有什么问题?

2 个答案:

答案 0 :(得分:0)

您拥有的排名第一的

if (gf) {
    for (int i = 0; i < sm->count_db; i++) {
        if(gf->nameid...

最差的一个

if (gf->u_id...

答案 1 :(得分:0)

if使用&&测试多个条件,而一个错误条件导致整个if为假。
for多次迭代并测试一个条件,然后针对每个真实条件执行该块。
设置标志时,使用标志查找匹配项并跳过打印。

int use_sm(struct session *ss, int n) {
    struct db_sm *sm = sm->database(ss->get_sm);

    if (!sm)
        return 1;

    if (sm->enable && sm->count_db > 0) {
        struct get_dfs *gf = ss->data[n];
        if (gf) {
            int match = 0;
            for (int i = 0; i < sm->count_db; i++) {
                if(gf->u_id == sm->db[i].u_id) {
                    match = 1;//found a match
                }
            }
            if ( ! match) {//no matches
                printf("u_id %d ", gf->u_id);
                for (int i = 0; i < sm->count_db; i++) {
                    printf("db[%d].u_id %d ", i, sm->db[i].u_id);
                }
                printf("\n");
                sm->use_sm_sub(sm, 5);
                return 0;
            }
        }
    }
    return 1;
}