我编写了代码,但我的教授说使用continue
和goto
是不好的做法。我尝试用另一个while循环替换continue
语句,但它给了我不正确的输出。 continue和goto语句的结构是什么?
void getrare(int *arr, int *ordered, int len)
{
for (int index = 0; index < len; ++index)
{
int n = arr[index];
int d = 0;
while (n)
{
d = n % 10;
for (int i = 0; i < len; ++i)
{
if (i == index)
continue;
if (num_contains(d, arr[i]))
goto next_num;
}
++ordered[index];
next_num:
n /= 10;
}
}
}
答案 0 :(得分:3)
goto
被视为不良做法。我不知道为什么他也会在continue
上说出来。
无论如何 - 改变继续很容易 - 只需反转if
for (int i = 0; i < len; ++i)
{
if (i != index)
{
if (num_contains(d, arr[i]))
goto next_num;
}
}
或者更加简单:
for (int i = 0; i < len; ++i)
{
if (i != index && num_contains(d, arr[i]))
goto next_num;
}
现在,摆脱goto。
在这种特定情况下,您使用goto
来打破循环并跳过++。所以你可以把它改成:
int i;
for (i = 0; i < len; ++i)
{
if (i != index && num_contains(d, arr[i]))
break;
}
if (i == len)
++ordered[index];
...
注意:我按原样对您的代码执行了此更改。不审查它做了什么或它想做什么。这只是一般的代码优化方法。
修改强>
为避免同时使用break
,您可以使用if
中的条件来停止它。
就个人而言,我更喜欢break
。它更加清晰,这就是它在语言中的存在。
int i, stop = 0;
for (i = 0; i < len && !stop; ++i)
{
if (i != index && num_contains(d, arr[i]))
stop = 1;
}
if (i == len) //Or you can use if(!stop)
++ordered[index];
答案 1 :(得分:2)
这是一个只需要对代码进行最小更改的解决方案:
void getrare(int *arr, int *ordered, int len)
{
for (int index = 0; index < len; ++index)
{
int n = arr[index];
int d = 0;
while (n)
{
d = n % 10;
int i; // keep track of loop counter outside the loop
for (i = 0; i < len; ++i)
{
if (i != index && num_contains(d, arr[i]))
break;
}
// only increment the array if the loop exited before
// completing (implying the goto would have happened)
if (i == len)
{
++ordered[index];
}
// but always execute this next line of code
n /= 10;
}
}
}
答案 2 :(得分:0)
continue
在这种特殊情况下很糟糕,而且goto
一般都不好。我刚刚向您展示了以下相关部分:
while (n)
{
d = n % 10;
for (int i = 0;
i < len && !num_contains(d, arr[i]);
++i);
if(i == len)
++ordered[index];
n /= 10;
}
我不知道你究竟在做什么,但我也没有改变你的核心逻辑。
答案 3 :(得分:0)
分裂子功能有助于摆脱中断;继续转到循环:
bool does_contain(const int* arr, int len, int d, int ignoredIndex)
{
for (int i = 0; i < len; ++i) {
if (i != ignoredIndex && num_contains(d, arr[i])) {
return true;
}
}
return false;
}
void getrare(const int *arr, int *ordered, int len)
{
for (int index = 0; index < len; ++index)
{
int n = arr[index];
while (n)
{
int d = n % 10;
if (!does_contain(arr, len, d, index)) {
++ordered[index];
}
n /= 10;
}
}
}