Top.Mail.Ru
Ответы

Операторы ветвления в языке С

Всем привет, мне на стаковерфлоу помогли с задачкой, единственное, при разборе кода я не понимаю некоторые записи.

12345678910111213141516171819202122232425262728293031323334
   int nomin = 1; 
    int min1 = arr1[0]; 
 
    // check all values in arr1 
    for (int i = 0; i < A1MAX; i++) { 
        // current value we're going to test 
        int val = arr1[i]; 
 
        // check value if it's a _new_ minimum or we do _not_ yet have a minimum 
        if ((val < min1) || nomin) { 
            // scan all elements of arr2, looking for a match to the current 
            // arr1 value 
            int match = 0; 
            for (int j = 0; j < A2MAX; j++) { 
                match = (val == arr2[j]); 
                if (match) 
                    break; 
            } 
 
            // if the current value is _not_ in arr2, we have a new minimum 
            if (! match) { 
                min1 = val; 
                nomin = 0; 
            } 
        } 
    } 
 
    if (nomin) 
        printf("there are no elements in arr1 that are not in arr2\n"); 
    else 
        printf("the minimum element in arr1 not in arr2 is: %d\n",min1); 
 
    return nomin; 
} 

Как работает эта строчка?

1
 (scanf("%d", &arr1[i]) != 1) 

Как понять это условие? (после оператора или)

1
 if ((val < min1) || nomin) 

Вот эту строчку:

1
  if (match) 

И эту:

1
    if (! match) 

Спасибо

По дате
По рейтингу
Аватар пользователя
Новичок

Как работает эта строчка?
(scanf("%d", &arr1[i]) != 1)

функция scanf получает "поток" с ввода и пытается конвертировать согласно строке формата ( "%d" - например - означает десятичное целое число ), возращает количество "удачно" конвертированных данных ( то есть не равен единичке -> ошибка )

Аватар пользователя
Просветленный

Все условия работают одинаково: если в скобках 0, то условие считается ложным, если не 0, то истинным.
scanf передает управление юзеру (он может печатать в консоль). Когда юзер закончит печать, его ввод будет интерпретирован как одно целое число (%d), а затем оно будет передано в переменную, адрес которой равен адресу ячейки arr1[i] (то есть оно просто будет передано в arr1[i]). Если присвоение целого числа ячейке arr1[i] успешное, то scanf вернет 1 (1 успешное присвоение), если не успешное, то вернет 0 (0 успешных присвоений).