我想弄清楚为什么我最里面的 for
循环没有中断。
我已经为 char
数组的“列表”实现了一个 Caesar 密码。
void caesar(char **list, size_t listsize, unsigned int offset) {
for (size_t i = 0; i < listsize; i++) {
for (size_t j = 0; list[i] != NULL && j < sizeof(list[i]); j++) {
for (unsigned int k = 0; k < offset && (list[i][j] >= 65 && list[i][j] <= 90) || (list[i][j] >= 97 && list[i][j] <= 122); k++) {
if(list[i][j] == 122)
list[i][j] = 97;
else if(list[i][j] == 90)
list[i][j] = 65;
else
list[i][j]++;
//works with the break condition
/* if(k == offset - 1)
break;*/
}
}
}
}
所以如果没有最后一个 break
语句,我会得到一个无限循环,即使我的 break
循环的头部有一个 for
条件。
有人有想法吗?
答案 0 :(得分:1)
for (unsigned int k = 0; k < offset && (list[i][j] >= 65 && list[i][j] <= 90) || (list[i][j] >= 97 && list[i][j] <= 122); k++)
使用一些占位符标识符,循环条件以 a && b || c
的形式编写,由于运算符优先级,它被解析为 (a && b) || c
而不是您想要的 a && (b || c)
。您可以添加一些括号来修复它:
for (unsigned int k = 0; k < offset && ((list[i][j] >= 65 && list[i][j] <= 90) || (list[i][j] >= 97 && list[i][j] <= 122)); k++)
// ^ ^