【问题标题】:Can this switch statement be shortened?这个switch语句可以缩短吗?
【发布时间】:2016-03-10 00:16:31
【问题描述】:

这个 switch 语句可以缩短吗?这是正确的做法吗?很简单的东西,不知道用switch有没有意义。

这部分代码遍历一个数组以获取颜色的整数值(从 0 到大约 10),并使用 allegro 库用这种颜色绘制一个正方形。因此,对于 7 及以上,它将是黑色,对于更少,它将是灰色,对于 1,它将是非常浅的灰色。

 for (int j = 0; j < 50; j++) {
    for (int i = 0; i < 50; i++) {
        int value = cells[i + j * 50];
        if(value > 0) {
            unsigned char color;
            switch (value) {
                case 1 :
                     color = 200;
                    break;
                case 2 :
                    color = 180;
                    break;
                case 3 :
                    color = 140;
                    break;
                case 4 :
                    color = 100;
                    break;
                case 5 :
                    color = 60;
                    break;
                case 6 :
                    color = 40;
                    break;
                case 7 :
                    color = 20;
                    break;
                default: color = 0;
            }
            al_draw_filled_rectangle(i * 8, 400 - (j * 8), i * 8 + 8, 400 - (j * 8 + 8),
                                     al_map_rgb(color, color, color));
        }
    }
}

【问题讨论】:

  • 看起来valuecolor 有一个可以用方程式表示的非常简单的关系。
  • 哦,对不起,值 = 5 是我的错误。它们只是随机数,想法只是为较低的值制作更多的颜色
  • 为什么不建立一个关系,这样你就可以做一个简单的数学表达式而不是一个开关?

标签: c++ switch-statement allegro allegro5


【解决方案1】:

您可以使用查找表代替switch 语句

static const unsigned char COLORS[] = { 0, 200, 180, 140, 100, 60, 40, 20 };

unsigned char color = 
  value >= 0 && value < sizeof COLORS / sizeof *COLORS ? COLORS[value] : 0;

【讨论】:

  • 这很好,但我有一个警告:值类型 const int 可能不适合接收器类型 unsigned char。我认为那是因为最后是 0
  • ": (无符号字符)0;"有帮助,但我想这不是这样做的正确方法
  • 我得到了这个:警告:有符号和无符号整数表达式之间的比较 [-Wsign-compare] value sizeof(COLORS) ?颜色[值]:(无符号字符)0;
  • @Mateusz 这可能暗示value 需要未签名。您在这里使用签名类型有什么特别的原因吗?
  • 是的,因为值是颜色的强度量,它是正数。
【解决方案2】:

可以改写如下:

int colors[]={100,80,60,40,20};
for (int j = 0; j < 50; j++) {
    for (int i = 0; i < 50; i++) {
        int value = cells[i + j * 50];
        unsigned int color=0;
        color=colors[value];          
    }
}

【讨论】:

  • 如果值为 7,那么我们将超出数组索引
  • 这只是一个例子。您可以使数组更大,或者在查找值之前检查索引等。
  • 您需要添加一个if(或例如调用min)来处理default:
【解决方案3】:

这应该可以帮助您缩短开关。你只需要浪费 7 行来填充你的地图:

#include <map>
#include <iostream>
using namespace std;

int main() {
  int color;
  int value;
  cout << "Enter a color value 1-7: ";
  cin >> value;

  map<int, int> colormap;
  colormap[1] = 200;
  colormap[2] = 180;
  // etc...                                                                                                                            

  color = colormap[value];
  cout << "color = " << color << endl;

  return 0;
}

【讨论】:

  • 这个比switch还差
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2019-12-23
  • 2015-12-06
  • 2022-01-17
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多