Страница 1 из 1
Помогите не могу разобраться с синтаксисом оператора if
Добавлено: Пт авг 22, 2014 17:23:51
Kot_Bigimot
Добрый день решил разобраться с 1wire и встретил там функцию:
uint8_t onewire_skip() {
if (!onewire_reset()) // Функция onewire_reset() возвращает "0" или "1" не понятен прием со знаком неравенства (!onewire_reset())
return 0;
onewire_send(0xCC); // и непонятно как происходит ветвление где else ??????
return 1;
}
Извините за глупый вопрос я только начинаю осваивать AVR и СИ.
Спасибо за ответ!
Re: Помогите не могу разобраться с синтаксисом оператора if
Добавлено: Пт авг 22, 2014 17:52:17
Pink-Pank
Ветвления нет. Функция, в которой лежит if, возвращает 0 если onewire_reset() == 0 (в этом случае условие внутри if становится true и if выполняет оператор, следующим сразу за ней, т.е. return 0.
Далее просто выполняется еще одна функция и фунция завершается оператором return 1. Можно после if поставить else, но тут оно не принципиально, т.к. здесь нет кода, не зависящего от условия if. Поэтому else просто опустили.
Код: Выделить всё
uint8_t onewire_skip() {
if (!onewire_reset()) // Функция onewire_reset() возвращает "0" или "1" не понятен прием со знаком неравенства (!onewire_reset())
return 0;
else
{
onewire_send(0xCC); // и непонятно как происходит ветвление где else ??????
return 1;
}
}
! - меняет результат логической операции на противоположный. Т.е. если результат равен true (любое число, не равное 0), то с ! перед ним он принимает значение false (ноль), если значение false (0), то результат принимает значение true (обычно компилятор использует значение 1).
P.S. Может, все-таки рано еще с 1 wire разбираться? Мож че попроще освоить для начала? Русский язык, например..

бИгИмот.. ))
Re: Помогите не могу разобраться с синтаксисом оператора if
Добавлено: Пт авг 22, 2014 17:54:26
Kot_Bigimot
Спасибо !!!!!
Kot_Bigimot а где тут хоть одна русская буква??????
Re: Помогите не могу разобраться с синтаксисом оператора if
Добавлено: Вс авг 24, 2014 12:49:42
YS
uint8_t onewire_skip() {
if (!onewire_reset()) // Функция onewire_reset() возвращает "0" или "1" не понятен прием со знаком неравенства (!onewire_reset())
return 0;
onewire_send(0xCC); // и непонятно как происходит ветвление где else ??????
return 1;
}
"!" - логическая инверсия, про нее уже написали выше. На будущее - не путайте ее с побитовой инверсией - "~".
При выполнении конструкции return выполнение функции завершается, так что если if в вашем примере выполнится, то все, что в этой функции дальше строчки с return 0, не выполнится. Так что else тут можно пропустить.
По идее, смысл этого кода в том, что если устройство на шине обнаружено (onewire_reset()), он посылает устройству сигнал игнорировать адрес (для доступа ко многим устройствам одновременно или для упрощения, если на шине всего одно устройство) и возвращает 1. Если устройства нет, просто возвращает 0. Инверсия возвращаемого значения onewire_reset() видимо связана с особенностями реализации этой функции.