【发布时间】:2014-09-13 01:56:22
【问题描述】:
do {
int j, k;
if (num_copy_array[0][0] == num_copy_array[0][1]) {
goto next_num;
} else {
goto first_time;
}
for (j = 0; j < ARRAY_LEN; j++) {
for (k = 0; k < NUM_LEN; k++) {
goto skip;
first_time:
j = 0, k = 2;
skip:
for (int j_2 = 0; j_2 <= j; j_2++) {
for (int k_2 = 0; k_2 <= NUM_LEN; k_2++) {
if (j_2 == j && k_2 == k) {
goto next_digit;
}
if (num_copy_array[j][k] == num_copy_array[j_2][k_2]) {
goto next_num;
}
}
}
next_digit:;
}
}
} while (false);
/*
* some
* code
*/
:next_num // starts the bigger loop outside
这就是我在编写一个 c++ 程序以创建一个特殊的循环入口并打破多个循环时的结果。我必须在外面声明循环变量 'j, k' 才能在使用 goto 跳入循环之前声明它们,并使用假的 do-loop 来本地化它们。
很多人说“永远不要使用 goto”,我同意使用不必要的 goto 会产生不好的程序。然而,在这种情况下,我真的很难想出一个替代方案,而不是使用临时开关变量并在每个循环入口检查它们,我认为这种方式效率非常低且难以阅读。
您能想出一个更好的方法来使我的程序的这一部分变得更好,或者您有一般性的建议吗?
【问题讨论】:
-
整个想法是编写不需要
goto的代码,而不是以不同的方式模拟goto,即从字面上避免它。很难在代码中说出你想要做什么。 -
@xiver77:您能否解释一下这段代码试图做什么,或者在问题中包含整个函数?理解这段代码的目标非常困难(正如您在 cmets 中看到的那样)。
-
这段代码正是我们不鼓励
goto的原因。这就是说goto有非常值得尊敬的用途。这不是其中之一。 -
@OP,总而言之,你问这个问题是一件非常好的事情。不过,它可能更适合 codereview.SE。
-
我认为你需要在你的这个概念模型上做一些工作是公平的。