Логические операторы

Alexmin
Offline
Зарегистрирован: 24.10.2016

byte b1,b2,b3;

void setup() {
  Serial.begin(9600);

  b1 = 2;  b2 = 8;  b3 = (b1 and b2);

  Serial.println(b3);
 }

Почему Serial.println выводит, что b3 = 1 ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Alexmin, вам конечно спасибо, что придумали оператор "and" , но к сожалению стандарты языка уже устоялись, и он обозначается иначе :).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimax пишет:

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.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alexmin пишет:

b1 = 2;  b2 = 8;  b3 = (b1 and b2);

Почему Serial.println выводит, что b3 = 1 ?

Ну, ... как бы ... всё правильно, а Вы чего ожидали?

Alexmin
Offline
Зарегистрирован: 24.10.2016

Если вместо AND поставить && то будет то-же самое  - 1,  а должен быть 0;

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Alexmin пишет:

Если вместо AND поставить && то будет то-же самое  - 1,  а должен быть 0;

 

??????????? Пардон май френч, но с хера ли? (не равно ноль) И (не равно ноль) есть (не равно ноль). То есть истина, ити её! ;) ;) ;)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alexmin пишет:

Если вместо AND поставить && то будет то-же самое  - 1,  а должен быть 0;

C какого перепугу? 1 и должен быть. Изучайте внимательно как работает &&

TD27T
Offline
Зарегистрирован: 08.04.2016

Alexmin пишет:

Если вместо AND поставить && то будет то-же самое  - 1,  а должен быть 0;

 

Подозреваю, вам нужен bitand, либо &, а не &&

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Alexmin,  вам нужны битовые операторы, обратите внимапние на группу Bitwise Operators

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

ЕвгенийП пишет:

Ошибаетесь.

Раздел 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.

Хм. Я тоже когда-то попался на эту удочку, но потом нашёл стандарты. И задал вопрос, на который так никто и не ответил - "Если кто в теме, ответьте пожалуйста - применяются ли в практике диграфы и как часто? Любопытство одолевает".

ЕвгенийП, может Вы ответите? Их реально используют? Как по мне, так это только больше запутывает...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

напридумают словов блин.. "диграфы" короче это обычный макрос, встроенный в компилятор. Вот я их нашёл, глубоко лежали :)

C:\Program Files (x86)\arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include

#ifndef _ISO646_H
#define _ISO646_H

#ifndef __cplusplus
#define and	&&
#define and_eq	&=
#define bitand	&
#define bitor	|
#define compl	~
#define not	!
#define not_eq	!=
#define or	||
#define or_eq	|=
#define xor	^
#define xor_eq	^=
#endif

#endif

 

Alexmin
Offline
Зарегистрирован: 24.10.2016

Я просто привык, что AND - сбросить биты, OR - установить. И в голову не пришло, что байт в данном случае рассматривается как целое, без учета того, что он состоит из 8-ми бит. Офигеть, какое полезное изобретение !!!

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Jeka_M пишет:

ЕвгенийП, может Вы ответите? Их реально используют? Как по мне, так это только больше запутывает...

Ну, сам-то я слишком старая собака, чтобы учиться новым фокусам, а люди используют. Особенно популярно это в производных от С++ языках для параллельного программирования. Это собственно не языки даже, а тот же С++ но с раширениями. Так там я даже видел такую забавную штуку - опциями компилятора можно запретить &&, || и т.п., а оставить только эти новоделы. Народ использует это для того, чтобы программы (куски программ) ещё не подвергавшиеся переделке и расппараллеливанию случайно не проскочили в сборку по чьему-либо раздолбайству. А то бы они нормально скомпилировались, т.к. С++ - просто подмножество их языка

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

 

Alexmin пишет:

Я просто привык, что AND - сбросить биты, OR - установить.

Тебе же ясно сказали, что ты попутал БИТОВЫЕ и ЛОГИЧЕСКИЕ операции. Это вообще разные операции и знаки у них разные в практически любом языке прогрммирования.

"Привык" он, my ass!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:

Тебе же ясно сказали, что ты попутал БИТОВЫЕ и ЛОГИЧЕСКИЕ операции. Это вообще разные операции и знаки у них разные в практически любом языке прогрммирования.

Не в любом.

В Паскале, например, битовые и логические операторы записываются одинаково, а компилятор различает их потому, что в Паскале булевы и целые переменные - различные сущности. В Си булевы не отличаются от целых, и именно поэтому пришлось ввести различную запись для булевых и битовых операций.

Т.е. различное написание - это не необходимость, а лишь следствие слабой типизации.