Операторы ветвления в языке С
Всем привет, мне на стаковерфлоу помогли с задачкой, единственное, при разборе кода я не понимаю некоторые записи.
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;
} Как работает эта строчка?
(scanf("%d", &arr1[i]) != 1) Как понять это условие? (после оператора или)
if ((val < min1) || nomin) Вот эту строчку:
if (match) И эту:
if (! match) Спасибо
Как работает эта строчка?
(scanf("%d", &arr1[i]) != 1)
функция scanf получает "поток" с ввода и пытается конвертировать согласно строке формата ( "%d" - например - означает десятичное целое число ), возращает количество "удачно" конвертированных данных ( то есть не равен единичке -> ошибка )
Все условия работают одинаково: если в скобках 0, то условие считается ложным, если не 0, то истинным.
scanf передает управление юзеру (он может печатать в консоль). Когда юзер закончит печать, его ввод будет интерпретирован как одно целое число (%d), а затем оно будет передано в переменную, адрес которой равен адресу ячейки arr1[i] (то есть оно просто будет передано в arr1[i]). Если присвоение целого числа ячейке arr1[i] успешное, то scanf вернет 1 (1 успешное присвоение), если не успешное, то вернет 0 (0 успешных присвоений).