Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

variable might not have been initialized

218  
madmonkey местный житель23.08.17 12:42
madmonkey
23.08.17 12:42 

Господа гуру, я не программист, я еще балуюсь...

Объясните, по какой такой причине в примере минимум из 3-х, в строке 8, переменной min нужно присваивать значение иначе компилятор ругается, а в примере минимум из 4-х этого делать уже не обязательно?


Rule your mind or it will rule you (Buddha)
#1 
MrSanders старожил23.08.17 12:51
NEW 23.08.17 12:51 
в ответ madmonkey 23.08.17 12:42

Потому что компилятор не анализирует правила в if-ах. В первом примере у вас (для компилятора) есть "execution path" в котором min не будет инициализирован.

#2 
Murr патриот23.08.17 14:33
Murr
NEW 23.08.17 14:33 
в ответ madmonkey 23.08.17 12:42

Во втором примере - удали 8-ю и замени 11-15 на return min(min1, min2);


Тогда вопрос в чистом виде будет по функции инт мин() и ответ на него выше.

#3 
madmonkey местный житель23.08.17 17:02
madmonkey
NEW 23.08.17 17:02 
в ответ Murr 23.08.17 14:33

Спасибо всем за отклики.

Решений вагон и маленькая тележка, можно вообще с 8 по 15 всё в return запихнуть, я не понимаю почему в идентичных, на мой взгляд, решениях компилятор ведет себя по разному.

К сожалению, что ответил выше мистер Сандерс, я не понял... Не дорос еще...

Rule your mind or it will rule you (Buddha)
#4 
dymanoid знакомое лицо23.08.17 17:23
dymanoid
NEW 23.08.17 17:23 
в ответ madmonkey 23.08.17 17:02

Решения не идентичные.

В одном случае - if-else, при этом переменная min инициализируется перед использованием и в If, и в else.

В другом случае - if-if-if-If, но else нету. Переменная инициализируется только в if'ах, но есть же ещё и отсутствующая else ветвь. Если при выполнении кода мы в неё попадём, то будет неинициализированная переменная, чего компилятор не хочет.

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

#5 
madmonkey местный житель23.08.17 17:24
madmonkey
NEW 23.08.17 17:24 
в ответ MrSanders 23.08.17 12:51

В первом примере есть только if-ы и если ни один не сработает(теоретически) то min так и останется без значения и компилятор пытается этого не допустить.

Во втором примере есть ef/else и в данном случае, что-то, но всеравно положится в min.

Верно?
Rule your mind or it will rule you (Buddha)
#6 
MrSanders старожил23.08.17 17:24
NEW 23.08.17 17:24 
в ответ madmonkey 23.08.17 17:02

Компилятор видит красный путь от начала к концу, в котором min не инициализируется. Он не проверяет что одно из 3-х условий обязательно выполнится.

#7 
madmonkey местный житель23.08.17 17:26
madmonkey
NEW 23.08.17 17:26 
в ответ dymanoid 23.08.17 17:23

Спасибо, я как раз тоже дошел до этого )))glass

Rule your mind or it will rule you (Buddha)
#8 
Программист коренной житель23.08.17 17:30
NEW 23.08.17 17:30 
в ответ madmonkey 23.08.17 12:42

В 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 определено

if (IsJuli)

min = b; // min определено

if (IsOddDay)

min = c; // min определено


В таком случае, во вторник 22-го августа переменная min окажется не инициализирована.

Более того, в понедельник 3-го июля значение переменной min будет присвоено аж 3 раза :)


Так вот, компилятор видит, что существует кака минимум один "проход" при котором переменная min не будет инициализарована и ругается на этот вариант :)

#9 
Murr патриот23.08.17 18:04
Murr
NEW 23.08.17 18:04 
в ответ madmonkey 23.08.17 17:02

Компилятор не вычисляет условия. Он строит код который их вычисляет.

В первом примере на каждом ИФе компилятор строит код в результате выполнения которого, при ложном условии, переменная может оставатья неинициализированной.

Сквозную проверку по всем условиям во всех ИФах компилятор не делает.

В результате - для компилятора в конце вычислений переменная может остаться неинициализированной - об этом он и сообщает.

#10 
madmonkey местный житель23.08.17 18:14
madmonkey
NEW 23.08.17 18:14 
в ответ Murr 23.08.17 18:04

Н.п. Тему понял, всем спасибоglass.

Rule your mind or it will rule you (Buddha)
#11