C开关箱值不能在开关内修改(非常数)

C开关箱值不能在开关内修改(非常数),c,arduino,switch-statement,C,Arduino,Switch Statement,我试图在一个游戏中创造弹跳动力,我正在arduino uno上编程 我可以创建一系列嵌套的ifs,但我听说切换速度更快。 我知道case值被指定为常量,但我很好奇是否有可能使这段代码工作 // player and ball are both byte arrays switch(ball[0]) { // bounce off edges x-axis case (player[0]-1): ball[3] -= 2; b

我试图在一个游戏中创造弹跳动力,我正在arduino uno上编程
我可以创建一系列嵌套的ifs,但我听说切换速度更快。
我知道case值被指定为常量,但我很好奇是否有可能使这段代码工作

// player and ball are both byte arrays
    switch(ball[0]) { // bounce off edges x-axis
        case (player[0]-1):
            ball[3] -= 2;
            break;
        case player[0]:
            ball[3] -= 1;
            break;
        case (player[0]+3):
            ball[3] += 1;
            break;
        case (player[0]+4): // At this line the compiler says: the value of 'player' is not usable in a constant expression
            ball[3] += 2;
            break;
    }

我很确定答案是否定的,或者将变量转换为常量的解决方法比简单地向嵌套的ifs屈服要慢得多,也要大得多,但问一下也无妨。

Avi Berger提出了一个奇妙的解决方案,我能够适应并使其发挥作用:

// player and ball are both byte arrays
    switch(ball[0] - player[0]) { // bounce off edges x-axis
    case 1:
        ball[3] -= 2;
        break;
    case 0:
        ball[3] -= 1;
        break;
    case -3:
        ball[3] += 1;
        break;
    case -4:
        ball[3] += 2;
        break;
    }

如果。。。否则如果。。。elsechain来处理类似的事情。我也这么想,但我看不出投票失败的原因。我问了一个有效的问题,我清楚而直接地回答了。Case值必须是编译时常量。我不知道你的例子有多真实,但在那个例子中,你可以通过开关(球[0]-player[0]){case-1:…}来实现这一点。你确定你的if/else原始代码是一个瓶颈吗?@Jabberwocky不,我不是。我的目标是创建一个响应时间相同的代码片段,不管选择什么,它都是快速的,并且编译的小,就像MCU一样。我相信这符合这些意图。