Почему я должен набрать i ++; вне блока if? - PullRequest
0 голосов
/ 16 января 2019

При нахождении максимального значения из массива, почему я должен печатать i++ за пределами блока if?

int[] x = new int[] { 5, 7, -100, 400, 8 };

int i = 1;
int max;

max = x[0];

while (i < x.Length)
{
    if (x[i] > max)
    {
        max = x[i];
    }
    i++;
}
Console.WriteLine("MAX="+max);

Ответы [ 5 ]

0 голосов
/ 16 января 2019

Если вы i ++ внутри блока if, вы входите в бесконечный цикл: (

        while (i < x.Length)
        {
            if (x[i] > max)
            {
                max = x[i];
                i++;
            }                
        }

предположим, что этот массив x = new int [] {9, 8}

i = 1
max = 9
while ( 1 < 2 ){//and 1<2 is always true i=1 and x.length=2
     if ( 8 > 9){ //false, never enter
       max = 8
       i++  //never happens, i is always 1
     }    
}

если у вас проблемы с индексами, вы можете использовать «foreach» вместо «while»

        int[] x = new int[] { 5, 7, -100, 400, 8 };
        int max;

        max = x[0];
        foreach (int elem in x)
        {
            if (elem > max)
                max = elem;
        }

        Console.WriteLine("MAX=" + max);
        Console.ReadLine();
0 голосов
/ 16 января 2019

Предположим, что ваш массив состоит из следующих значений

int[] x = new int[] { 2, 2, 2, 2, 2 };

тогда как вы можете найти максимальное значение, используя i++ внутри блока if. Вы застрянете в бесконечном цикле.

0 голосов
/ 16 января 2019

Приращение i++ должно быть помещено вне оператора if (, как вы сделали в коде, которым вы поделились ), чтобы избежать возможности создания бесконечного цикла сценарий.

Оператор if потенциально может быть оценен как false, и, следовательно, значение i не будет увеличиваться, поэтому цикл while будет выполняться бесконечно. Этот сценарий может возникнуть, когда следующее целое число в вашем массиве x будет меньше или равно любому из ранее посещенных целых чисел в массиве.

Сохранение i++ приращения вне оператора if обеспечивает его выполнение во время каждого цикла.

0 голосов
/ 16 января 2019

Если вы поместите его в блок if, я буду увеличивать его только при увеличении max, позволяя циклу while работать вечно, если каждое значение в массиве больше предыдущего.

0 голосов
/ 16 января 2019

Если вы увеличиваете только i внутри блока if, то, как только условие x[i] > max оценивается как false, i не будет увеличиваться. И поскольку мы используем i в качестве индекса для элемента массива, который нужно исследовать, значение x[i] никогда не изменится, и поэтому цикл будет продолжаться вечно.

И, для чего стоит, когда вы перебираете массив, цикл for лучше подходит, потому что он позволяет вам определять переменную итерации, условие и приращение - все в одном месте:

int[] x = new int[] { 5, 7, -100, 400, 8 };
int max = x[0];

for(int i = 1; i < x.Length; i++)
{
    if (x[i] > max) max = x[i];
}

Console.WriteLine("MAX = " + max);
...