ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
94790 Топик полностью
Vit (22.07.2007 14:33, просмотров: 1) ответил Т.Достоевский на Не понял как это использовать совместно с if ?
Как выражение;) if/*если*/(выражение == true) {делаем ВЫРАЖЕНИЕ1} else/*иначе, т.е. выражение == false*/{делаем ВЫРАЖЕНИЕ2} if/*если*/((!выражение) == true) {делаем ВЫРАЖЕНИЕ2} else/*иначе, т.е. выражение == true*/{делаем ВЫРАЖЕНИЕ1} В Си логическое true равно 1 (в других языках бывает, например, -1), а значение false равно 0. Однако действует умолчание/соглашение, согласно которому всё, что не false равно true (в качестве результата логического выражения точно). Т.е. принимая, например, #define LED (5) результатом выражения (PINC & (1<<LED)), в преобразованном виде (PINC & 0x20), может быть либо 0x20, либо 0x00. (!(PINC & (1<<LED))) может давать два значения - !0x20 и !0x00, что даст false (в отличие от выражения ~0x20, которое даст 0xDF) и true соответственно, т.е. 0 и 1. В принципе в if можно поставить и (PINC & (1<<LED)) и не заморачиваться, а через else выбрать что делать. Что обычно и делается. Но иногда хочется получить значение какого-то бита как число 0 или 1, тогда одна или две ЛОГИЧЕСКИХ инверсии (!false эквивалентно true, а !true эквивалентно false). Например, в регистре настроек UASRT-а есть бит удвоения скорости, а мы хотим по формуле из DS рассчитывать значения регистра делителя в формуле в зависимости от делителя где-то есть умножение на 2. Вместо этого умножения подставлям вместо if(значение бита удвоения){(множитель*2)} else{(множитель*1)} выражение вида (множитель<<значение бита удвоения), где значение бита удвоения эквивалентно (!!(PORT&(1<<bitNo))). Компиляторы такое обычно хорошо оптимизируют.