You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 Credit PSET编译错误求助:逻辑或操作符误用问题

问题排查与代码修正

错误根源

编译提示的use of logical '||' with constant operand是因为你错误地用逻辑或||来判断数值是否属于某一组常量。逻辑或||的作用是连接布尔表达式,返回的是布尔值(0或1),而非你想要的“数值是否等于其中任意一个”。比如(4 || 34)会被编译器计算为true(即1),导致你的判断完全偏离预期。

具体修正点

所有形如(x || y || z)的数值判断都要改成逐个用==连接||(判断等于)或!=连接&&(判断不等于):

  1. 外层的if (number != (4 || 34 || ...))改为:

    if (number != 4 && number != 34 && number != 37 && number != 51 && number != 52 && number != 53 && number != 54 && number != 55)
    

    (原逻辑是“如果number不是这些开头值,就循环缩小到开头位”)

  2. do-while循环的条件改为:

    while (testnumber4 != 4 && testnumber4 != 34 && testnumber4 != 37 && testnumber4 != 51 && testnumber4 != 52 && testnumber4 != 53 && testnumber4 != 54 && testnumber4 != 55)
    
  3. 卡组织判断的条件修正:

    • AMEX判断:else if (testnumber4 == 34 || testnumber4 == 37)
    • MASTERCARD判断:else if (testnumber4 == 51 || testnumber4 == 52 || testnumber4 == 53 || testnumber4 == 54 || testnumber4 == 55)

修正后的完整代码片段

if (counter > 12 && counter < 17) // check first condition
{
    if (sum % 10 == 0) // check 2nd condition
    {
        // 修正:逐个判断不等于的情况
        if (number != 4 && number != 34 && number != 37 && number != 51 && number != 52 && number != 53 && number != 54 && number != 55)
        {
            do
            {
                testnumber4 /= 10;
            }
            // 修正:循环直到得到卡组织开头标识
            while (testnumber4 != 4 && testnumber4 != 34 && testnumber4 != 37 && testnumber4 != 51 && testnumber4 != 52 && testnumber4 != 53 && testnumber4 != 54 && testnumber4 != 55);
            
            if (testnumber4 == 4)
            {
                printf("VISA\n");
            }
            // 修正:正确判断AMEX的两个开头
            else if (testnumber4 == 34 || testnumber4 == 37)
            {
                printf("AMEX\n");
            }
            // 修正:正确判断MASTERCARD的开头
            else if (testnumber4 == 51 || testnumber4 == 52 || testnumber4 == 53 || testnumber4 == 54 || testnumber4 == 55)
            {
                printf("MASTERCARD\n");
            }
            else
            {
                printf("INVALID\n");
            }
        }
        else
        {
            printf("INVALID\n");
        }
    }
    else
    {
        printf("INVALID\n");
    }
}
else
{
    printf("INVALID\n");
}

额外优化建议

如果觉得多个||/&&太冗长,可以把卡组织的开头值放进数组,用循环判断是否属于集合,代码会更整洁:

int valid_prefixes[] = {4, 34, 37, 51, 52, 53, 54, 55};
int is_valid_prefix(int num) {
    for (int i = 0; i < sizeof(valid_prefixes)/sizeof(valid_prefixes[0]); i++) {
        if (num == valid_prefixes[i]) return 1;
    }
    return 0;
}

之后就可以用if (!is_valid_prefix(number))替代冗长的判断,可读性更强。

内容的提问来源于stack exchange,提问作者Azzam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:40:31