找不到重复案例时出现“案例标签值已出现在此开关中”
我正在用 C++ 编写游戏 2048,作为熟悉该语言的练习。最初,代码没有抛出任何错误,但我在最终产品中遇到了一些逻辑错误,所以我认为问题可能是我错误地使用了逻辑门。我查了一下,显然正确的语法是 or||在我只使用时|,在我将所有这些都更改为||我的 switch 语句之后,开始说有重复的情况,但似乎没有任何情况。这可能是由什么引起的?
void slide(char direction){
int i;
int j;
switch (direction){
case 'W' || 'w':
for (j = 0; j < boardSize; j++){
int firstZero = -1;
for (i = 0; i < boardSize; i++){
if (board[i][j] == 0 && firstZero < 0){
firstZero = i;
}
if (board[i][j] > 0 && firstZero >= 0){
int temp = board[i][j];
board[i][j] = board[firstZero][j];
board[firstZero][j] = temp;
if (i != boardSize-1){
i = 0;
firstZero = -1;
}
}
}
}
break;
case 'A' || 'a':
break;
case 'S' || 's':
break;
case 'D' || 'd':
break;
}
}
回答
你应该看看这种方法:
case 'A': // If it is A, fall through
case 'a': // If it is a, pick this case
// Do something
break;
// Other cases...
这样,选择就会落空。
关于为什么您的条件形式不起作用:
条件 - 整型或枚举类型的任何表达式,或可在上下文中隐式转换为整型或枚举类型的类类型的任何表达式,或带有大括号或等号初始值设定项的此类类型的单个非数组变量的声明。- cppreference.com
条件的计算结果应等于对其进行测试的常量表达式之一的值。这会导致||未按预期评估的情况;所有的条款评价为1 (因为这两个A和a不为零),因此所述多个箱子是相同的。
底线:case标签必须是一个整数常量表达式。