variable might not have been initialized
Господа гуру, я не программист, я еще балуюсь...
Объясните, по какой такой причине в примере минимум из 3-х, в строке 8, переменной min нужно присваивать значение иначе компилятор ругается, а в примере минимум из 4-х этого делать уже не обязательно?
Спасибо всем за отклики.
Решений вагон и маленькая тележка, можно вообще с 8 по 15 всё в return запихнуть, я не понимаю почему в идентичных, на мой взгляд, решениях компилятор ведет себя по разному.
К сожалению, что ответил выше мистер Сандерс, я не понял... Не дорос еще...
Решения не идентичные.
В одном случае - if-else, при этом переменная min инициализируется перед использованием и в If, и в else.
В другом случае - if-if-if-If, но else нету. Переменная инициализируется только в if'ах, но есть же ещё и отсутствующая else ветвь. Если при выполнении кода мы в неё попадём, то будет неинициализированная переменная, чего компилятор не хочет.
Другой вопрос, что этот случай может и не наступить, потому что параметры функции, например, этого не позволят. Но компилятору об этом ничего не известно, поэтому он берёт худший случай.
В первом примере есть только if-ы и если ни один не сработает(теоретически) то min так и останется без значения и компилятор пытается этого не допустить.
Во втором примере есть ef/else и в данном случае, что-то, но всеравно положится в min.
В 11-й строке напиши "else if..."
А 13-ю строку замени на "else"
Грубо говоря твой пример сводится к такому:
int min; // min не определено
if (a<=b && a<=c)
min = a; // min определено
else
;// min не определено
if (b<=a && b<=c)
min = b; // min определено
else
;// min не определено
if (c<=a && c<=b)
min = c; // min определено
else
;// min не определено
Т.е. получается, что если ни одно из 3-х условий не выполняются, то min остается неопределенной.
Логика твой задачи такова, что одно из условий обязательно выполняется, но компилятор ничего не знает о логике твоей задачи, он проверяет синтаксис. Грубо говоря, условия ты можешь заменить так:
if (IsMonday ())
min = a; //
min определено
min = b; // min определено
min = c; // min определено
В таком случае, во вторник 22-го августа переменная min окажется не инициализирована.
Более того, в понедельник 3-го июля значение переменной min будет присвоено аж 3 раза :)
Так вот, компилятор видит, что существует кака минимум один "проход" при котором переменная min не будет инициализарована и ругается на этот вариант :)
Компилятор не вычисляет условия. Он строит код который их вычисляет.
В первом примере на каждом ИФе компилятор строит код в результате выполнения которого, при ложном условии, переменная может оставатья неинициализированной.
Сквозную проверку по всем условиям во всех ИФах компилятор не делает.
В результате - для компилятора в конце вычислений переменная может остаться неинициализированной - об этом он и сообщает.