Не работает компилятор как нада.

Densl
Offline
Зарегистрирован: 28.11.2018

Читал что в условии if если сравнивают какие-то условия объединяя их так && то компил по идее может прочесть последнее условие, увидеть что оно ложь и первое условие даже не прочесть. А если там функция, которая должна выполнится полюбому? Тогда прога не будет работать как нада. Почему ардуина так не делает???

rkit
Offline
Зарегистрирован: 23.11.2016

Densl пишет:
то компил по идее может прочесть последнее условие, увидеть что оно ложь и первое условие даже не прочесть

Не может. Сначала выполняется левый аргумент &&, если он является правдой, то выполняется правый. Иначе не выполняется.

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

Densl пишет:
Читал что в условии if если сравнивают какие-то условия объединяя их так && то компил по идее может прочесть последнее условие, увидеть что оно ложь и первое условие даже не прочесть. А если там функция, которая должна выполнится полюбому? Тогда прога не будет работать как нада. Почему ардуина так не делает???

Вапще-то конпилятор с первого условия начинает.  И если оно уже ложно, то дальше вычислять операнд команды && совершенно бессмысленно. 

if (MyClass != NULL && MyClass.Method()) ...

метод класса не будет вызван, если сам класс не создан (==NULL)

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

Densl пишет:
Читал что в условии if если сравнивают какие-то условия объединяя их так && то компил по идее может прочесть последнее условие, увидеть что оно ложь и первое условие даже не прочесть. А если там функция, которая должна выполнится полюбому? Тогда прога не будет работать как нада. Почему ардуина так не делает???

так вы возьмите да проверьте

bool funcLeft() {
Serial.println("Left function started!");
return false;
}
bool funcRight() {
Serial.println("Right function started!");
return false;
}
void setup() {
Serial.begin(9600);
if ( funcLeft() && funcRight() ) {
 Serial.println("oops!");
}
Serial.println("Done!");
}
void loop() {}

 

Densl
Offline
Зарегистрирован: 28.11.2018

Ну ясно, значит сначала он первое условие смотрит, и если чо второе отбрасывает. По идее с конца было бы проще ему вычислять, но для пущего удобства сделали для чайников.

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

Densl пишет:
сделали для чайников.

"... суждения космического масштаба и космической же глупости..."

 

SLKH
Offline
Зарегистрирован: 17.08.2015

Densl пишет:
Ну ясно, значит сначала он первое условие смотрит, и если чо второе отбрасывает. По идее с конца было бы проще ему вычислять, но для пущего удобства сделали для чайников.
 

а почему с хвоста проще? он араб/индус/еврей?

 

Densl
Offline
Зарегистрирован: 28.11.2018

Может конечно бред, но для быстродействия сначала в стек он положит операнды начиная с первого и потом выполнит над ними операцию. Читать из стека можно с последнего элемента, а можно и из первого. В стандарте есть чего про это сейчас?

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

Densl пишет:
Может конечно бред, но для быстродействия сначала в стек он положит операнды начиная с первого и потом выполнит над ними операцию. Читать из стека можно с последнего элемента, а можно и из первого. В стандарте есть чего про это сейчас?

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

запустите его на Ардуино, потом скомпилируйте в GCC под линуксом, а потом в MFC в винде. Сравните результаты - и тогда можно будет обсудить, что "для чайников", а что нет

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Делаю проще - ставлю скобки и голову не ломаю.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Densl пишет:

Читал ...

"Лжёшь, собака!"

Densl пишет:

сделали для чайников.

Это да! Страдивари вот скрипки для лохов делал, а для нормальных пацанов - барабаны!

Densl пишет:

Читать из стека можно с последнего элемента, а можно и из первого. 

э-э-э ... вот это видео, в общем.

Densl пишет:

В стандарте есть чего про это сейчас?

В общем, так ... "плаху, палача и рюмку водки. Водку мне, остальное ему".

Densl
Offline
Зарегистрирован: 28.11.2018

Не, реально читал давно про такое, вроде даже писали что лучше больше одного условия в if не вставлять, чтобы переносимость кода была с одной платформы на другую. Заменить вложенными if - aми такую структуру. Типа никто не даёт гарантии какая часть отбросится.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Возможно, ты читал такого же грамотея как ты, а, возможно, просто не понял прочитанного и всё с прямым углом перепутал.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Densl пишет:

Читать из стека можно с последнего элемента, а можно и из первого.

Ничо_нипонял :)))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

-NMi- пишет:

Ничо_нипонял :)))

А ты посмотри на мой комментарий к этой фразе в #10 - поймёшь.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Ой, дууурак......  так чтоле ???

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

DetSimen пишет:

Вапще-то конпилятор с первого условия начинает.

Т.е. в стандарте Си оговорен порядок вычисления и он предписывает читать условия слева направо?

(я не прикалываюсь, в разных языках по-разному, а Си - не мой родной язык)

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

andriano пишет:

Т.е. в стандарте Си оговорен порядок вычисления и он предписывает читать условия слева направо?

На уровне стандартов я тоже не знаю, не читал, только по жизненному опыту.  Мошт, проснется кто-нить из толкователей стандартов, расскажут точнее. 

в Delphi точно так, как я сказал, 146%, выражения вычисляются слева направо

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

andriano пишет:

Т.е. в стандарте Си оговорен порядок вычисления и он предписывает читать условия слева направо?

На уровне стандартов я тоже не знаю, не читал, только по жизненному опыту.  Мошт, проснется кто-нить из толкователей стандартов, расскажут точнее. 

в Delphi точно так, как я сказал, 146%, выражения вычисляются слева направо

Расизмом попахивает )))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Операции «логическое И» и «логическое ИЛИ» вычисляют свои операнды слева направо с ленивой логикой, т.е. сначала вычисляется левый, а потом, если нужно, то и правый (стр. 135, §§ 8.14 и 8.15).

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

Это как раз общая практика. А определённая последовательность – исключение. В стандарте так и написано: «за исключением тех мест, где это отмечено особо, последовательность вычисления операндов отдельного оператора или подвыражений выражения не определена» (стр. 14, §4.6(17)).

Кстати, DetSimen, точно не знаю, но думаю, что в делфи также - это сейчас мейнстрим - везде так делают. Это я про неопределённость в сложении/вычитании и т.п.

Что же касается «ленивой логики», то там (в делфи) допустима как ленивая логика (она там называется «Short-Circuit Boolean Evaluation») так и полная логика – «Complete Boolean Evaluation». Управляется опцией {$B}. Правда, если хотя бы один из операндов имеет тип Variant, то на опцию {$B} плюют и всегда выполняют полностью.