c - 如何减少c语言if语句中的多个OR条件
问题描述
对于此代码,我得到“函数的复杂度为 48,大于授权的 20。” 如何降低复杂性?
void print_element_int_to_buf(p_printbuffer buf, const char *tag, int value, int mandatory)
#else
static void print_element_int_to_buf(p_printbuffer buf, const char *tag, int value, int mandatory)
#endif
{
if(strcmp(tag,"probableCause") == 0){
if((value >=0 && value <= 20)||(value >= 51 && value <= 70)||(value >= 81 && value <= 82)||(value >= 101 && value <= 133)||(value >= 151 && value <= 158)||(value >= 301 && value <= 303)||(value >= 305 && value <= 308)||(value >= 310 && value <= 311)||(value >= 315 && value <= 317)||(value >= 321 && value <= 327) ||(value >= 332 && value <= 334)||(value >= 339 && value <= 340)||(value >= 342 && value <= 348)||(value >= 350 && value <= 354)||(value >= 356 && value <= 357)||(value >= 501 && value <= 552)||(value >= 561 && value <= 593)||(value >= 701 && value <= 709)||(value >= 711 && value <= 718)||(value >= 1000 && value <= 1065)){
bufprintf(buf, "<%s>", tag);
bufprintf(buf, "%i", value);
bufprintf(buf, "</%s>", tag);
bufprintf(buf, "\n");
}
else if((value == 136 || value == 203 || value == 313 || value ==330 || value == 336)){
bufprintf(buf, "<%s>", tag);
bufprintf(buf, "%i", value);
bufprintf(buf, "</%s>", tag);
bufprintf(buf, "\n");
}
else{}
}
else{
if(value != 0){ /* OSS_FC_013378_US_4370787_US_4745111: Schema validation using libxml2 for FM */
bufprintf(buf, "<%s>", tag);
bufprintf(buf, "%i", value);
bufprintf(buf, "</%s>", tag);
bufprintf(buf, "\n");
}
}
}
解决方案
使用表格来测试范围,包括多数字范围和单例范围,如下所示:
struct range
{
int lo;
int hi;
};
static const struct range ranges[] =
{
{ 0, 20 },
{ 51, 70 },
{ 81, 82 },
{ 101, 133 },
{ 136, 136 }, /* Singleton */
{ 151, 158 },
{ 203, 203 }, /* Singleton */
{ 301, 303 },
{ 305, 308 },
{ 310, 311 },
{ 313, 313 }, /* Singleton */
{ 315, 317 },
{ 321, 327 },
{ 330, 330 }, /* Singleton */
{ 332, 334 },
{ 336, 336 }, /* Singleton */
{ 339, 340 },
{ 342, 348 },
{ 350, 354 },
{ 356, 357 },
{ 501, 552 },
{ 561, 593 },
{ 701, 709 },
{ 711, 718 },
{ 1000, 1065 },
};
enum { NUM_RANGES = sizeof(ranges) / sizeof(ranges[0]) };
extern void bufprintf(p_printbuffer buf, const char *tag, ...);
static void print_tag_value(p_printbuffer buf, const char *tag, int value)
{
bufprintf(buf, "<%s>", tag);
bufprintf(buf, "%i", value);
bufprintf(buf, "</%s>", tag);
bufprintf(buf, "\n");
}
static void print_element_int_to_buf(p_printbuffer buf, const char *tag, int value)
{
if (strcmp(tag, "probableCause") == 0)
{
for (int i = 0; i < NUM_RANGES; i++)
{
if (value >= ranges[i].lo && value <= ranges[i].hi)
{
print_tag_value(buf, tag, value);
break;
}
}
}
else if (value != 0)
{
print_tag_value(buf, tag, value);
}
}
如果bufprintf()
是 的专用版本printf()
,则可以将 4 个调用的顺序减少到一个调用。该问题已更新以提供界面print_element_int_to_buf()
功能。它包括一个未使用的参数mandatory
,我在修改后的函数中省略了它。我已经使用这些信息为该bufprintf()
函数提供了一个合理的原型。
推荐阅读
- macos - 当尝试运行某些东西时,mac终端上的权限被拒绝
- python - 如何基于静音分割音频文件并在python中重叠最后说2秒
- python - 避免在刮擦过程中被发现
- php - 在另一个类中设置一个类的变量
- ecmascript-6 - Lodash:根据条件查找和删除多级Json中的项目
- python - Python > MYSQL > json 解析不起作用
- python - Python-从函数调用中去掉括号?
- python - 如何重新排序 Pandas 中的多索引列?
- python - 在递归中使用scrapy回调时xlsxwriter无法创建文件
- atomic - 使用 QWeb 模板在 Odoo 中进行原子设计