Почему я получаю эту ошибку: не все пути кода возвращают значение? - PullRequest
0 голосов
/ 30 мая 2009

привет, я новичок в c # и пытался написать код, но получил ошибку Кто-нибудь может мне помочь с этим, что я делаю не так?

using System;
using System.Collections.Generic;
using System.Text;

namespace hodder
{
    class Program
    {
        public static void Main()
        {
            isHodder(3);
        }

        static int isHodder(int n)
        {
            int k = n;
            for (int i = 2; i <= n / 2;i++ )
            {
                if ((n % 1) == 0)
                {
                    return 0;
                }
                else
                {
                    for (int j = 2; j <= k;j++ )
                    {
                        if (n == (2^ j)  - 1)
                        {
                            return 1;
                        }
                        else
                        {
                            return 0;
                        }
                        k=(2^j)-1;
                    }
                }
            }
        }
    }
}

я получаю сообщение об ошибке «static int isHodder (int n)» «hodder.Program.isHodder (int)»: не все пути кода возвращают значение

и «Обнаружен недоступный код» на «k = (2 ^ j) -1»

Ответы [ 5 ]

7 голосов
/ 30 мая 2009

Первая ошибка, «не все пути кода возвращают значение» означает, что существует путь, по которому код может следовать, где не будет возвращено значение (то есть: вызов isHodder (1)) Вам нужно вернуть некоторое значение вне цикла for. Кроме того, поскольку у вас есть блок if / else внутри второго цикла for, строка

k=(2^j)-1;

никогда не будет исполнено.

    static int isHodder(int n)
    {
        int k = n;
        for (int i = 2; i <= n / 2; i++)
        {
            if ((n % 1) == 0)
            {
                return 0;
            }
            else
            {
                for (int j = 2; j <= k; j++)
                {
                    if (n == (2 ^ j) - 1)
                    {
                        return 1;
                    }
                    else
                    {
                        return 0;
                    }
                    k = (2 ^ j) - 1;
                }
            }
        }
        return 0;
    }
4 голосов
/ 30 мая 2009

Эта строка очень подозрительна:

if ((n % 1) == 0)
1 голос
/ 30 мая 2009

Что произойдет, если я позвоню isHodder(1)? К какому ответу я могу обратиться?

Мы можем вообще не входить в цикл for (или если мы его введем, компилятор не может быть уверен, что достигнем оператора return, прежде чем покинем цикл).

0 голосов
/ 04 апреля 2013

Для этой проблемы вы должны использовать void, если ваша функция не возвращала никакого значения, иначе вы должны определить возвращаемое значение в конце вашей функции.

0 голосов
/ 30 мая 2009

@ jalf: верно для случая, когда 2 <= n / 2 (то есть 4 <= n). В этом случае вы никогда не войдете в цикл <em>для , поэтому вам нужен возврат после for.

Как подсказал @Kenny,

if ((n % 1) == 0)

Подозреваемый. n% 1 всегда == n, поэтому условие будет истинным только при n == 0. Однако это также может быть опечаткой, поскольку условие не проверяет ничего, что изменяется в цикле. Вы имели в виду

if ((n % i) == 0)

...