ветвь кода с if

456
10 мая 2017, 06:16

Всем привет, имеется вот такой if, у которого понятное дело есть else:

if(array[i].Equals(array[i+1])) //aaaabcaaaa
            { 
                count++; //count=4 //количество одинаковых повторений
                p = array[i]; //запоминаем какие именно буквы одинаковы -например несколько a подряд
                while(array[i].Equals(array[i + 1]))
                {
                            return true;
                }

            }
            else
            {
                flag_start = true; //нашли b и c

Компилятор ругается, что не все кода возвращают значение - я грешу на этот if который у меня был без return но проблема в том, что я не могу вернуть в нем определенное значение return т.к этот блок if можно считать - затравкой перед основным блоком else, в котором и происходит основная работа программы -т.е мне нужно возвращать определенное, в данном случае булево значение ждя данного блока if - пока его условие не станет ложным ион не перейдет в блок else. Для этого я вставил в блок if цикл while -который проверяет - тоже самое условие, что и блок if - т.е ложными они станут одновременно. Идея в чем - блок while будет возвращать true, пока блок if не вернет false и не перейдет к else - это может сработать или возвращаемое значение будет распространяться только для while? И еще такой вопрос, есть ли в Visual Studio - способ посмотреть, какая именно ветвь кода не возвращает значение - т.е какое либо представление или что-то типа Reflector?

Answer 1

Вы правильно поняли что не нравится компилятору. Я так понял, что у вас идет проблема в понимании.

Если вы пишете функцию, то она должна вернуть какое-то значение (случае void функций она просто должна завершится).

Вот что получится если разобраться в вашем алгоритме

ветки 1,2 приведут к завершению программы ветка 3 нет и если статический анализатор кода пропустит ваш код к этапу компиляции то возникнет ситуация, что при каких-то параметрах ваша программа пойдет по ветке 3, и тогда комп, грубо говоря, зависнет на мертво (хотя может быть какие-то системные функции могут его реанимировать)

давайте разберем следующий код

public class Program
{
    public static int test(int a, int b, int c)
    {
        int count = 0;
        if (a == b)
        {
            while(b == c)
            {
                count++; //ваши манипуляции с ответом 
                return count;
            }
            return count;
        }else{
            count = 99; //ваши манипуляции с ответом 
            return count;
        }
    }
    public static int test1(int a, int b, int c)
    {
        int count = 0;
        if (a == b && b == c)
            count++; //ваши манипуляции с ответом 
        if (a != b)
            count = 99; //ваши манипуляции с ответом 
        return count;
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(test(0,0,0));
        Console.WriteLine(test(0,0,1));
        Console.WriteLine(test(0,1,0));
        Console.WriteLine(test(1,1,0));

        Console.WriteLine("\n\n\n");
        Console.WriteLine(test1(0,0,0));
        Console.WriteLine(test1(0,0,1));
        Console.WriteLine(test1(0,1,0));
        Console.WriteLine(test1(1,1,0));
        /* вывод
        1
        0
        99
        0
        1
        0
        99
        0*/
    }
}

Если в функции стоит if, то он пойдет по одной из 2 веток. И если внутри него вызвать return, то завершится вся функция а не блок if. С while тоже самое.

В примере я написал функцию test, которая по логике похожа на вашу. И есть функция test1, которая делает тоже самое

Заметьте как отличается код test и test1. В test1, есть переменная
count которая в конце всегда что-то возвращает, и она изначально инициализирована каким-то дефолтным значением, а в остальном теле функции происходят манипуляции с этим значением. При разработке программ такая практика только плюсик к вашей карме даст.

Если хотите прервать выполнение while пишите правильные условия выполнения и не нужно будет ничего мудрить.

По поводу вашего последнего вопроса не знаю, я не пользователь VS

P.S. мне кажется вы явно делаете что-то не то (задание должно быть не сильно сложным и алгоритм очень простой)

READ ALSO
Как правильно настроить checkBox1_CheckedChanged

Как правильно настроить checkBox1_CheckedChanged

При исходном запуске программы: 1Режим - исходный

320
Nunit и вызов exception

Nunit и вызов exception

Делаю тесты для своей программыСтолкнулся с такой проблемой

227
Кнопки произвольной формы в Unity3d

Кнопки произвольной формы в Unity3d

Как реализовать кнопку произвольной формы?

522
Сохранение файла в облаке

Сохранение файла в облаке

ТакНадеюсь правильно поставлю вопрос

370