我已经创建了一个将整数输入转换为另一个整数的函数。具体来说,它采用控制台颜色,并返回与输入具有相同背景但具有白色字符的相应颜色。
此函数始终返回255.出了什么问题?
int convertColorToPlayerColor(int color)
{
int playerColor = 0;
if (color <= 15)
playerColor = 15;
else if ((color > 15) && (color <= 31))
playerColor = 31;
else if ((color > 31) && (color <= 47))
playerColor = 47;
else if ((color > 47) && (color <= 63))
playerColor = 63;
else if ((color > 63) && (color <= 79))
playerColor = 79;
else if ((color > 79) && (color <= 95))
playerColor = 95;
else if ((color > 95) && (color <= 111))
playerColor = 111;
else if ((color > 111) && (color <= 127))
playerColor = 127;
else if ((color > 127) && (color <= 143))
playerColor = 159;
else if ((color > 159) && (color <= 175))
playerColor = 175;
else if ((color > 175) && (color <= 191))
playerColor = 191;
else if ((color > 191) && (color <= 207))
playerColor = 207;
else if ((color > 207) && (color <= 223))
playerColor = 223;
else if ((color > 223) && (color <= 239))
playerColor = 239;
else if (color > 239);
playerColor = 255;
return playerColor;
}
答案 0 :(得分:4)
你有一个额外的分号:
else if (color > 239); // <--- the semicolon
额外的分号被解析为&#34;然后&#34;空if
语句的一部分。这有效地将您的功能转变为
[ a long-winded if-else statement ]
playerColor = 255;
return playerColor;
答案 1 :(得分:1)
除了你有额外的分号之外,你可以使用return
内的if
并删除多余的支票来简化你的功能:
if (color <= 15)
return 15;
if (color <= 31) // no need to check color > 15
return 31;
if (color <= 47) // no need to check color > 31
return 47;
...
return 255; // no need for if (color > 239)
您也可以进行二进制查找而不是线性检查:
int convertColorToPlayerColor(int color)
{
static std::vector<int> v { 15, 31, 47, 63, 79, 95, 111, 127, 143, 175, 191, 207, 223, 239 };
auto it = std::lower_bound( v.begin(), v.end(), color );
return it == v.end() ? 255 : *it;
}
这不仅会使它更有效,更短,而且更容易出错(因为你不必多次重复数字)。请记住,vector中的值必须按排序顺序排列。