Не работает компилятор как нада.
- Войдите на сайт для отправки комментариев
Пт, 10/04/2020 - 15:24
Читал что в условии if если сравнивают какие-то условия объединяя их так && то компил по идее может прочесть последнее условие, увидеть что оно ложь и первое условие даже не прочесть. А если там функция, которая должна выполнится полюбому? Тогда прога не будет работать как нада. Почему ардуина так не делает???
Не может. Сначала выполняется левый аргумент &&, если он является правдой, то выполняется правый. Иначе не выполняется.
Вапще-то конпилятор с первого условия начинает. И если оно уже ложно, то дальше вычислять операнд команды && совершенно бессмысленно.
if (MyClass != NULL && MyClass.Method()) ...
метод класса не будет вызван, если сам класс не создан (==NULL)
так вы возьмите да проверьте
Ну ясно, значит сначала он первое условие смотрит, и если чо второе отбрасывает. По идее с конца было бы проще ему вычислять, но для пущего удобства сделали для чайников.
"... суждения космического масштаба и космической же глупости..."
а почему с хвоста проще? он араб/индус/еврей?
Может конечно бред, но для быстродействия сначала в стек он положит операнды начиная с первого и потом выполнит над ними операцию. Читать из стека можно с последнего элемента, а можно и из первого. В стандарте есть чего про это сейчас?
Денсл, вы мой код запустили? Что получилось?
запустите его на Ардуино, потом скомпилируйте в GCC под линуксом, а потом в MFC в винде. Сравните результаты - и тогда можно будет обсудить, что "для чайников", а что нет
Делаю проще - ставлю скобки и голову не ломаю.
Читал ...
"Лжёшь, собака!"
сделали для чайников.
Это да! Страдивари вот скрипки для лохов делал, а для нормальных пацанов - барабаны!
Читать из стека можно с последнего элемента, а можно и из первого.
э-э-э ... вот это видео, в общем.
В стандарте есть чего про это сейчас?
В общем, так ... "плаху, палача и рюмку водки. Водку мне, остальное ему".
Не, реально читал давно про такое, вроде даже писали что лучше больше одного условия в if не вставлять, чтобы переносимость кода была с одной платформы на другую. Заменить вложенными if - aми такую структуру. Типа никто не даёт гарантии какая часть отбросится.
Возможно, ты читал такого же грамотея как ты, а, возможно, просто не понял прочитанного и всё с прямым углом перепутал.
Читать из стека можно с последнего элемента, а можно и из первого.
Ничо_нипонял :)))
Ничо_нипонял :)))
А ты посмотри на мой комментарий к этой фразе в #10 - поймёшь.
Ой, дууурак...... так чтоле ???
Вапще-то конпилятор с первого условия начинает.
Т.е. в стандарте Си оговорен порядок вычисления и он предписывает читать условия слева направо?
(я не прикалываюсь, в разных языках по-разному, а Си - не мой родной язык)
Т.е. в стандарте Си оговорен порядок вычисления и он предписывает читать условия слева направо?
На уровне стандартов я тоже не знаю, не читал, только по жизненному опыту. Мошт, проснется кто-нить из толкователей стандартов, расскажут точнее.
в Delphi точно так, как я сказал, 146%, выражения вычисляются слева направо
Т.е. в стандарте Си оговорен порядок вычисления и он предписывает читать условия слева направо?
На уровне стандартов я тоже не знаю, не читал, только по жизненному опыту. Мошт, проснется кто-нить из толкователей стандартов, расскажут точнее.
в Delphi точно так, как я сказал, 146%, выражения вычисляются слева направо
Расизмом попахивает )))
Операции «логическое И» и «логическое ИЛИ» вычисляют свои операнды слева направо с ленивой логикой, т.е. сначала вычисляется левый, а потом, если нужно, то и правый (стр. 135, §§ 8.14 и 8.15).
Но это довольно редкое исключение в языке (другое исключение, например, тернарный оператор). Для большинства же бинарных операторов (сложение, вычитание и т.п.) порядок вычисления операндов не определён. Также не определён порядок вычисления аргументов при вызове функции. Определено только, что они все должны быть вычислены прежде, чем функция начнёт выполняться.
Это как раз общая практика. А определённая последовательность – исключение. В стандарте так и написано: «за исключением тех мест, где это отмечено особо, последовательность вычисления операндов отдельного оператора или подвыражений выражения не определена» (стр. 14, §4.6(17)).
Кстати, DetSimen, точно не знаю, но думаю, что в делфи также - это сейчас мейнстрим - везде так делают. Это я про неопределённость в сложении/вычитании и т.п.
Что же касается «ленивой логики», то там (в делфи) допустима как ленивая логика (она там называется «Short-Circuit Boolean Evaluation») так и полная логика – «Complete Boolean Evaluation». Управляется опцией {$B}. Правда, если хотя бы один из операндов имеет тип Variant, то на опцию {$B} плюют и всегда выполняют полностью.