CS50 Credit PSET编译错误求助:逻辑或操作符误用问题
问题排查与代码修正
错误根源
编译提示的use of logical '||' with constant operand是因为你错误地用逻辑或||来判断数值是否属于某一组常量。逻辑或||的作用是连接布尔表达式,返回的是布尔值(0或1),而非你想要的“数值是否等于其中任意一个”。比如(4 || 34)会被编译器计算为true(即1),导致你的判断完全偏离预期。
具体修正点
所有形如(x || y || z)的数值判断都要改成逐个用==连接||(判断等于)或!=连接&&(判断不等于):
外层的
if (number != (4 || 34 || ...))改为:if (number != 4 && number != 34 && number != 37 && number != 51 && number != 52 && number != 53 && number != 54 && number != 55)(原逻辑是“如果number不是这些开头值,就循环缩小到开头位”)
do-while循环的条件改为:while (testnumber4 != 4 && testnumber4 != 34 && testnumber4 != 37 && testnumber4 != 51 && testnumber4 != 52 && testnumber4 != 53 && testnumber4 != 54 && testnumber4 != 55)卡组织判断的条件修正:
- AMEX判断:
else if (testnumber4 == 34 || testnumber4 == 37) - MASTERCARD判断:
else if (testnumber4 == 51 || testnumber4 == 52 || testnumber4 == 53 || testnumber4 == 54 || testnumber4 == 55)
- AMEX判断:
修正后的完整代码片段
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
相关产品推荐
相关产品推荐

