为什么这个函数没有返回正确的值?

时间:2016-10-20 21:20:43

标签: c++ windows

我已经创建了一个将整数输入转换为另一个整数的函数。具体来说,它采用控制台颜色,并返回与输入具有相同背景但具有白色字符的相应颜色。

此函数始终返回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;
}

2 个答案:

答案 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中的值必须按排序顺序排列。