Как использовать переменную, добавленную в цикле, в основной части кода?

public class Practical {
    public static void main(String[] args) {
        int[]num={8,12,30};
        int first=num[0];
        int second=num[1];
        int third=num[2];

        if (first<second & first<third){
            int **min**=first;
        } else if (second<first & second<third) {
            int **min**=second;
        } else if (third<first & third<second){
            int **min**=third;
        }

        if (first>second & first>third){
            int **max**=first;
        } else if (second>first & second>third) {
            int **max**=second;
        } else if (third>first & third>second){
            int **max**=third;
        }

        int finish=max-min;
    }
}

Ответы (3 шт):

Автор решения: Nowhere Man

В данном случае переменные min, max не добавляются в цикле (в данном коде вообще нет операторов цикла for, while, do/while), а объявляются в блоке кода в условном операторе if.

Как известно, область видимости переменной, объявленной в блоке кода, ограничена этим блоком кода, поэтому попытка обратиться к переменным min и max в теле метода main за пределами блоков, где они были объявлены, приводит к ошибкам компиляции:

Error:(24, 20) java: cannot find symbol
        int finish=max-min;        
                   ^
  symbol:   variable max
  location: class Practical
Error:(24, 24) java: cannot find symbol
        int finish=max-min;        
                       ^
  symbol:   variable min
  location: class Practical

Если нужно присваивать значения неким переменным внутри блока кода и использовать эти переменные после блока, такие переменные нужно объявлять до начала блока кода.

Но простое объявление переменных в нужном месте:

int min;
if (first<second & first<third) {
    min=first;
} else if (second<first & second<third) {
    min=second;
} else if (third<first & third<second) {
    min=third;
}
int max;
if (first>second & first>third) {
    max=first;
} else if (second>first & second>third) {
    max=second;
} else if (third>first & third>second) {
    max=third;
}
int finish=max-min;

вызовет другие ошибки компиляции:

Error:(25, 20) java: variable max might not have been initialized
Error:(25, 24) java: variable min might not have been initialized

так как всегда используются дополнительные условия else if (новое_условие) вместо однозначной альтернативы else, и компилятор не должен "предугадывать" результаты неоднозначной логики.

Также из-за использования оператора & в условных операторах обе части условия if (a < b & a < c) будут проверяться всегда (без короткого замыкания), поэтому выполняется много лишних проверок. Но и применение оператора && с коротким замыканием в данном случае излишне.

Значительно проще сразу определить минимум/максимум для первой пары чисел, а затем сравнивать полученные значения с третьим числом:

int min, max;
if (a < b) {
    min = a;
    max = b;
} else {
    min = b;
    max = a;
}
if (c < min) {
    min = c;
} else if (c > max) {
    max = c;
}

То есть, для определения минимума и максимума трёх чисел достаточно трёх операторов сравнения.

→ Ссылка
Автор решения: ksa

Предложу такое решение...

public class Test {
    public static void main(String[] args) {
        int[]num = {8,12,30};
        int first = num[0];
        int second = num[1];
        int third = num[2];
        int min = Math.min(Math.min(first, second), third);
        int max = Math.max(Math.max(first, second), third);
        System.out.println("Результат = " + (max - min));
    }
}

Либо вообще вот так, если дело касается массива...

public class Test {
    public static void main(String[] args) {
        int[]num = {8,12,30};
        if (num.length == 0) {
            System.out.println("Результат не определен");
            return;
        }
        int min = num[0];
        int max = num[0];
        for (int i = 1; i < num.length; i++) {
            min = Math.min(min, num[i]);
            max = Math.max(max, num[i]);
        }
        System.out.println("Результат = " + (max - min));
    }
}
→ Ссылка
Автор решения: Дмитрий Алексеенко

У вас есть массив типа int, можно просто пройтись циклом по нему

int[] nums = new int[]
{
    8, 2, 1, 12, 30
};

// выставляем первое значение из массива
// для переменной min и max
int min = nums[0]; 
int max = nums[0];

for (int idx = 0; idx < nums.length; idx++)
{
    // проверяем является ли значение nums[idx] > или <
    int num = nums[idx];
    if (max < num)
    {
        max = num;
    }

    if (num < min)
    {
        min = num;
    }
}
int finish=max-min;

Такое решение будет более приемлемое с точки зрения читаемости кода и проще в понимание, чем большое количество условий if

→ Ссылка