Логические операторы
- Войдите на сайт для отправки комментариев
Пт, 26/05/2017 - 13:15
byte b1,b2,b3;
void setup() {
Serial.begin(9600);
b1 = 2; b2 = 8; b3 = (b1 and b2);
Serial.println(b3);
}
Почему Serial.println выводит, что b3 = 1 ?
Alexmin, вам конечно спасибо, что придумали оператор "and" , но к сожалению стандарты языка уже устоялись, и он обозначается иначе :).
Alexmin, вам конечно спасибо, что придумали оператор "and" , но к сожалению стандарты языка уже устоялись, и он обозначается иначе :).
Ошибаетесь.
Раздел 2.12, таблица 5 (стр. 22), а также раздел 2.6, таблица 2 (стр. 20) стандарта ISO/IEC 14882:2014 определяет альтернативные обозначения: and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq.
Причём это было ещё в стандарте 11 года ISO/IEC 14882:2011.
b1 = 2; b2 = 8; b3 = (b1 and b2);
Почему Serial.println выводит, что b3 = 1 ?
Ну, ... как бы ... всё правильно, а Вы чего ожидали?
Если вместо AND поставить && то будет то-же самое - 1, а должен быть 0;
Если вместо AND поставить && то будет то-же самое - 1, а должен быть 0;
??????????? Пардон май френч, но с хера ли? (не равно ноль) И (не равно ноль) есть (не равно ноль). То есть истина, ити её! ;) ;) ;)
Если вместо AND поставить && то будет то-же самое - 1, а должен быть 0;
C какого перепугу? 1 и должен быть. Изучайте внимательно как работает &&
Если вместо AND поставить && то будет то-же самое - 1, а должен быть 0;
Alexmin, вам нужны битовые операторы, обратите внимапние на группу Bitwise Operators
Ошибаетесь.
Раздел 2.12, таблица 5 (стр. 22), а также раздел 2.6, таблица 2 (стр. 20) стандарта ISO/IEC 14882:2014 определяет альтернативные обозначения: and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq.
Причём это было ещё в стандарте 11 года ISO/IEC 14882:2011.
Хм. Я тоже когда-то попался на эту удочку, но потом нашёл стандарты. И задал вопрос, на который так никто и не ответил - "Если кто в теме, ответьте пожалуйста - применяются ли в практике диграфы и как часто? Любопытство одолевает".
ЕвгенийП, может Вы ответите? Их реально используют? Как по мне, так это только больше запутывает...
напридумают словов блин.. "диграфы" короче это обычный макрос, встроенный в компилятор. Вот я их нашёл, глубоко лежали :)
C:\Program Files (x86)\arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include
Я просто привык, что AND - сбросить биты, OR - установить. И в голову не пришло, что байт в данном случае рассматривается как целое, без учета того, что он состоит из 8-ми бит. Офигеть, какое полезное изобретение !!!
ЕвгенийП, может Вы ответите? Их реально используют? Как по мне, так это только больше запутывает...
Ну, сам-то я слишком старая собака, чтобы учиться новым фокусам, а люди используют. Особенно популярно это в производных от С++ языках для параллельного программирования. Это собственно не языки даже, а тот же С++ но с раширениями. Так там я даже видел такую забавную штуку - опциями компилятора можно запретить &&, || и т.п., а оставить только эти новоделы. Народ использует это для того, чтобы программы (куски программ) ещё не подвергавшиеся переделке и расппараллеливанию случайно не проскочили в сборку по чьему-либо раздолбайству. А то бы они нормально скомпилировались, т.к. С++ - просто подмножество их языка
Я просто привык, что AND - сбросить биты, OR - установить.
Тебе же ясно сказали, что ты попутал БИТОВЫЕ и ЛОГИЧЕСКИЕ операции. Это вообще разные операции и знаки у них разные в практически любом языке прогрммирования.
"Привык" он, my ass!
Тебе же ясно сказали, что ты попутал БИТОВЫЕ и ЛОГИЧЕСКИЕ операции. Это вообще разные операции и знаки у них разные в практически любом языке прогрммирования.
Не в любом.
В Паскале, например, битовые и логические операторы записываются одинаково, а компилятор различает их потому, что в Паскале булевы и целые переменные - различные сущности. В Си булевы не отличаются от целых, и именно поэтому пришлось ввести различную запись для булевых и битовых операций.
Т.е. различное написание - это не необходимость, а лишь следствие слабой типизации.