Странный оператор

dimin21590
dimin21590 аватар
Offline
Зарегистрирован: 26.10.2016

Всем привет на днях поевилась нужда в реле на ИК датчике. В библиотеке нашел пример но никак не могу понять што происходить в 2 строчках.

if (millis() - last > 250) {
      on = !on;
//вот начало
      digitalWrite(RELAY_PIN, on ? HIGH : LOW);
      digitalWrite(13, on ? HIGH : LOW);
//вот конец
      dump(&results);
    }

Что тут означает вопросительный знак двуйточие и как ето работает?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Это тернарный оператор. По простому - если истинно выражение до "?", то выполнится то, что  до ":", иначе - после.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Короткой форме записи

digitalWrite(RELAY_PIN, on ? HIGH : LOW);

соответствует длинная

if(on)
digitalWrite(RELAY_PIN, HIGH);
else
digitalWrite(RELAY_PIN, LOW);

Про оператор выше правильно написали.

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

А-фи-геть!

А написать просто:

digitalWrite(RELAY_PIN, on);

религия не позволяет?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

нормальный оператор.

Куда хуже для понимания конструкция 

x = a+++b;

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

а можно и так x = a+++++b;

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

двуйточие.....

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Этак вы и до Brainfuck-a скатитесь

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

DetSimen пишет:

Этак вы и до Brainfuck-a скатитесь

От Си до брейнфака можно только подняться!

CatSoup
Offline
Зарегистрирован: 01.05.2017

Гуру кода, подскажите, пожалуйста, почему:

На эту строку компиль ругается:

msg = "Alarm! " + (sens1state ? "Light sensor 1; " : "") + (sens2state ? "Light sensor 2; " : "") + (shockSensState ? "Shock sensor." : "");

типа оператору "+" скармливаются неправильные типы "const char",

а если "успокоить" gcc ручным приведением типов, которое, по идее тут ни во что не упиралось, т.к. результатом выполнения условной операции будет тип String:

msg = "Alarm! " + String((sens1state ? "Light sensor 1; " : "")) + String((sens2state ? "Light sensor 2; " : "")) + String((shockSensState ? "Shock sensor." : ""));

то все работает?

b707
Offline
Зарегистрирован: 26.05.2017

CatSoup - в чем вопрос-то? String и char - разные типы, нуждаются в приведении.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

CatSoup - в чем вопрос-то? String и char - разные типы, нуждаются в приведении.

странно, потому что у объекта String есть метод 

friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr);
 
поэтому, какбэ явно преобразовывать необходимости нет. 
b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

странно, потому что у объекта String есть метод 

friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr);
 
поэтому, какбэ явно преобразовывать необходимости нет. 

так как ты пишешь - в операторе хотя бы один операнд должен быть типа String, а у автора все const char

b707
Offline
Зарегистрирован: 26.05.2017

проверил - вот такой код приведения не требует:

boolean   sens1state;
String msg2;
String msg = msg2 + (sens1state ? "Light sensor 1; " : "");

 

CatSoup
Offline
Зарегистрирован: 01.05.2017

Таким образом, то, что заключено в " " - тип char, из этого становится понятно, почему нужно приведение, но... в таком случае - это массив типа char 0_о? Жизнь меня к такому не готовила))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

так как ты пишешь - в операторе хотя бы один операнд должен быть типа String, а у автора все const char

Ви таки безусловно правы. 

Значит ему первый операнд достаточно к String привести тогда и остальные отоматом приведуца.