我刚刚学会了方法声明并且我不太了解如何使用它,我试图制作一个算法,它需要2个数字并返回它们最小的公共分频,如果没有公共分频器,则返回 - 1,那就是代码:
class Program
{
static int Div(int a, int b)
{
int max = Math.Max(a, b);
bool div = false;
for(int i = 2; i <= max / 2; i++)
{
if (a % i == 0 && b % i == 0)
{
return i;
div = true;
i = max;
}
}
if (div == false)
{
return -1;
}
}
static void Main(string[] args)
{
Console.WriteLine("Please Enter 2 Numbers");
int num = int.Parse(Console.ReadLine());
int num2 = int.Parse(Console.ReadLine());
Console.WriteLine(Div(num, num2));
}
}
它告诉我有一个无法访问的代码,并非所有代码路径都返回一个值,但为什么呢?如果我得到2个确实有一个公共分频器的数字它将返回它,如果不是它将返回-1,我认为没有任何执行,提前感谢
答案 0 :(得分:3)
编译器不够聪明。但是最后if
仍然是多余的,因为它总是false
,所以你可以编写以下内容,这也可以避免编译错误:
static int Div(int a, int b)
{
int max = Math.Max(a, b);
for (int i = 2; i <= max / 2; i++)
{
if (a % i == 0 && b % i == 0)
{
return i;
}
}
return -1;
}
循环中return
之后的部分无法访问且不必要,所以我已将其删除。
答案 1 :(得分:0)
当您使用return
时立即退出该功能,超出该行的代码将无法执行,因此无法访问该行。
return i;
div = true; <<
i = max; <<
在您的情况下,您似乎只想在返回之前设置这些值。
答案 2 :(得分:0)
if (a % i == 0 && b % i == 0)
{
return i;
div = true;
i = max;
}
永远不会到达返回后的2行。在返回前把它们放好。另外我认为你根本不需要div bool。这是多余的,可以进行优化。
答案 3 :(得分:0)
证明任意方法是否可以在不命中return
或抛出异常的情况下到达方法的末尾,这可能是一个无法解决的问题。如果你足够努力,你总是可以构造一个方法,使编译器无法证明端点是否可以访问。但是,编译器不允许任何具有返回值但没有可达端点的程序很重要。
因此,存在误报。编译器最好确定程序是否具有可访问的端点,如果它无法证明它,即使您和我都知道端点实际上不可访问,它也会出错。
您需要更改代码,以便编译器能够证明端点不可访问,最简单的方法是删除if (div == false)
行并且只是总是return -1;
。你和我知道那里div
永远不会成真,但编译器不够复杂,无法证明它。
答案 4 :(得分:0)
for循环中第一个if子句的返回位于代码的其余部分之前,因此有两行代码永远不会被命中,这两个代码:
SpecificationError: Function names must be unique, found multiple named <lambda>
他们永远不会被击中的原因是因为if if语句是真的,它会立即返回,如果它是假的,它会转到第二个if。 / p>
答案 5 :(得分:0)
2个原因:行div = true无法访问,返回后的代码不执行。取代
return i;
div = true;
i = max;
通过
int res=i;
div = true;
i = max;
return res;
最后一个&#39; if&#39;条款没有&#39;否则&#39;允许在所有情况下返回的条款;