Всем привет, имеется вот такой 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?
Вы правильно поняли что не нравится компилятору. Я так понял, что у вас идет проблема в понимании.
Если вы пишете функцию, то она должна вернуть какое-то значение (случае 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. мне кажется вы явно делаете что-то не то (задание должно быть не сильно сложным и алгоритм очень простой)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
При исходном запуске программы: 1Режим - исходный