C语言中如何简化冗长的条件判断语句,实现更紧凑的写法?
问题解答
C 语言本身没有提供 Python 中切片、in 范围判断等效的语法糖,但可以通过以下几种方式在完全不改动原有判断逻辑的前提下,大幅缩短冗长的条件语句:
- 第一种:直接用数值范围判断替换连续或运算
你写的连续判断numberArray[1] == 1 || numberArray[1] == 2 || ... || numberArray[1] ==5本身就可以简化为范围判断numberArray[1] >=1 && numberArray[1] <=5,简化后的MasterCard分支条件为:else if (cardLength == 16 && numberArray[0] ==5 && numberArray[1] >=1 && numberArray[1] <=5) - 第二种:拼接前两位为整数做范围判断,和Python的写法逻辑完全一致
把前两位数字拼接为两位数的整数,直接判断是否落在[51,55]区间即可:else if (cardLength == 16 && (numberArray[0] *10 + numberArray[1] >=51 && numberArray[0] *10 + numberArray[1] <=55)) - 第三种:封装宏进一步简化多分支判断
如果多个分支都要判断前缀,可以封装通用的前缀判断宏,后续所有分支都可以直接调用:
宏定义完成后,你的完整判断逻辑可以简化为(注:原代码if条件外层缺少括号,已补全修正语法错误):// 定义前缀范围判断宏,arr为存储每一位数字的数组,start、end为要匹配的前缀闭区间 #define MATCH_PREFIX(arr, start, end) ((arr[0] *10 + arr[1]) >= start && (arr[0] *10 + arr[1]) <= end)
这种写法代码可读性更高,后续新增卡种判断时也不需要重复写拼接逻辑。if (cardLength == 15 && (MATCH_PREFIX(numberArray, 34,34) || MATCH_PREFIX(numberArray, 37,37))) { printf("AMEX\n"); } else if (cardLength == 16 && MATCH_PREFIX(numberArray, 51,55)) { printf("MASTERCARD\n"); } else if (cardLength == 13 && numberArray[0] ==4) { printf("VISA\n"); } else { printf("INVALID\n"); }
内容的提问来源于stack exchange,提问作者haching
相关产品推荐
相关产品推荐

