这个 FOR-IF 循环的解释是什么?

What is explanation for this FOR-IF loop?

本文关键字:是什么 解释 FOR-IF 循环 这个      更新时间:2023-10-16

我正在用C++为GCD编写代码,但我遇到了一个神秘的错误,我似乎想不出它可能的原因。

在下面的程序中,如果两个数字都等于i...它将中断并返回i的值。

但它似乎不起作用,因为它将结果输出为1.

int gcd2(int a, int b) {
int i,hcf=0;
if (b > a) {
a = a + b;
b = a - b;
a = a - b;
}
for (i = 1; i <= b; ++i) {
if (a % i == 0 && b % i == 0) {
break;
}
}
return i; 
}

但是当我在同一代码中添加变量HCF时:

int gcd2(int a, int b) {
int i,hcf=0;
if (b > a) {
a = a + b;
b = a - b;
a = a - b;
}
for (i = 1; i <= b; ++i) {
if (a % i == 0 && b % i == 0) {
hcf = i;
}
}
return hcf;
}

它有效。为什么?谁能澄清一下?

变量hfc不是您注意到差异的原因。如果我们保留差异但在两个版本中引入hfc,我们将得到:

int hfc = 0;
for (i = 1; i <= b; ++i) {
if (some_condition(i)) {
hfc = i;
break;                  // breaks out of the loop
}
}
return hfc; 

int hfc = 0;
for (i = 1; i <= b; ++i) {
if (some_condition(i)) {
hfc = i;                 // no break !!!
}
}
return hfc; 

第一个返回some_condition(i)truei的第一个值。第二个版本返回some_condition(i)true的最后一个i值。这一点以及任何数字都可以被1整除的事实解释了您得到的不同结果。

两个样本之间的简单区别是循环是否遍历整个间隔,以及是返回第一个还是最后一个匹配项。

使用break可以在找到满足条件的第一个数字时停止。正如评论者所指出的,1 是所有数字的除法符,所以你应该从i = 2开始。然而,这种变体仍然不会在所有情况下找到最大的公约数。

另一方面,变量赋值可以多次调用,因此您的第二个样本返回最后一个样本,即找到的最大数字,这很可能是您想要的结果。