Бессмысленная конструкция?
- Войдите на сайт для отправки комментариев
Вс, 11/12/2016 - 16:06
Постоянно всплывает в памяти конструкция, которую как-то увидел на каком-то сайте в программе (жаль, не могу найти сейчас) и так и не понял. Выглядело всё примерно так:
if (a > b) c = d; else c = d;
Вроде бессмыслица, но стоило её убрать и заменить на
c = d;
что, вроде бы, тоже самое, как программа переставала работать как надо.
Кто-нибудь может объяснить, такое возможно? Или ... ну, вроде я тогда ничего не курил.
Нет-нет да вспомнится и покоя не даёт.
1. Судя по написанному, Вы не готовы поручиться, что конструкция была именно такой.
2. Вы привели лишь небольшую часть кода, в полном коде может оказаться нечто, сушественно меняющее смысл конструкций.
3. Вы привели код примерно. Не может оказаться так, что где-то используются не простые переменные, а функции?
4. Ардуино использует сильно оптимизирующий компилятор, который, возможно, вырезает нечто, что с первого раза неочевидно.
5. Не объявлены ли какие-нибудь из используемых переменных как volatile?
6. Бывает, в программе нужна небольшая задержка по времени, без которой не работает, и которая, порой, реализуется весьма нестандартными способами.
7. Ну и, наконец, в Инете масса программ, содержащих самые разные ошибки.
Какой вариант из приведенных Вам больше нравится?
if
(a > b) c = d;
else
c = d;
На мой взглюд здесь есть 3 варианта
1 a>b
2 a<b
3 a=b
Может как раз третий и выбивает программу?
2 и 3 - одна и та же ветка условного оператора.
3 a=b
Может как раз третий и выбивает программу?
Чем? Ну, срабатывает ветка "else", дальше-то что?
Присоединюсь к
2. Вы привели лишь небольшую часть кода, в полном коде может оказаться нечто, сушественно меняющее смысл конструкций.
Если предположить, что код запомнен и воспроизведён правильно, и что он действительно по своему поведению отличается от "c=d", то надо признать, что ничего нельзя сказать, если не знать, как объявлены переменные.
Нет никаких воспоминаний об этом?
Так-то, придумать этому коду "начало", чтобы всё было действительно так, как Вы написали, несложно, но ... тут у меня проблема ... придумать-то я могу специально. Но это будет языковое извращение. А вот предположить разумный код, где такое языковое извращение могло бы быть реально полезным и оправданным - так с ходу у меня не получается. Но само по себе, такое, конечно, возможно.
if
(a != b) c = d;
else c=25;
А такая конструкция?
Что "такая"?
Ошибочка!
"andriano" 2 и 3 - одна и та же ветка условного оператора.
Да, мужики, мой грех не сохранил и не знаю как там они описаны были.
Но говорите, что возможно такое? Чтобы вот так всё было (при каком-то описании переменных), да?
Спасибо, буду думать как именно такое можно сделать.
Ну, это правильный подход, думайте. Если что надумаете, покажите, интересно посмотреть, что у Вас получится. В том, что это возможно не сомневайтесь - возможно и не такое :)
Ошибочка!
"andriano" 2 и 3 - одна и та же ветка условного оператора.
Что Вы хотите этим сказать?
Что я ошибся
1 и 2 код дают 1 и тотже результат но за разное время может программисту была нужна эта микрозадержка.
у меня например даные с порта читались дальше программо которая неуспевала их обрабоать и приходилось подбирать задержки.
когде делей иногда и пустыми цыклами особенно есл иработаю какието исполнительные механизмя со скоростью 30-120 тактов в секунду
Может и так. При желании-то они и разный результат могут давать, только вот я никак не могу придумать для чего бы это было нужно. Ваше объяснение (типа результат один, но за разное время) интересно, но опять же ... мягко говоря экзотический способ организации задержки :)
Т.е. мне кажется главный вопрос "а нафига?" так и остаётся открытым.
А если так?
Первая d с цифрой 1, вторая - с буквой L.
Ну, это совсем другое, я понял вопрос ТС так, должно быть одинаково.
Да, должно быть одинаково.
Давайте точно сформулируем задачу. Требуется написать скетч, который содержал бы что угодно вместо "тут что-то"
и при этом его работа (например, то, что пишется в сериал) отличалось бы от работы скетча
Мне как вчера andriano c Евгением сказали, что это возможно, так я уже всю лысину прочесал.
Дайте маленькую подсказку. По каким ключевым словам искать нужные средства?
Курите перегрузку операции присвоения.
Можно и так, но я бы покурил перегрузку операции сравнения. И не забывать про "побочный эффект".
Ага, спасибо, приступаю к раскурке перегрузки операторов и побочного эффекта (последнее еле нашёл, всё фильм вылазит)
приступаю к раскурке перегрузки операторов
Непростая статейка. Мож оттого, что она рекламой перегружена, но я как-то боюсь, не вкурил бы, если бы не знал.
Присоединюсь, возможно "что угодно", но больше бы склонился к экзотическому способу задержки, чем к перегрузке типовых операций и тем более к побочным эффектам. Ибо это тоже самое что такой маккрос в "С":
#define if(p) if(rand(50)&&(p))
В смысле из той же оперы..
А если так?
Первая d с цифрой 1, вторая - с буквой L.
Ага, а с во втором случае русская))))
1 и 2 код дают 1 и тотже результат но за разное время может программисту была нужна эта микрозадержка.
у меня например даные с порта читались дальше программо которая неуспевала их обрабоать и приходилось подбирать задержки.
когде делей иногда и пустыми цыклами особенно есл иработаю какието исполнительные механизмя со скоростью 30-120 тактов в секунду
Пост 1 пункт 6.
А мне что-то кажется, что дело здесь в побочном эффекте. ТС не помнит точно, но можно предположить, что в скробках условного оператора была более сложная конструкция, имеющая побочный эффект.
Как известно, логическое выражение в этом случае вычисляется лишь до тех пор, пока не станет ясен результат. Вполне вероятно, в выражении присутствует функция с побочным эффектом, которая в одном случае вызывается, а в другом - нет (либо вызывается в обоих случаях, но имеет побочный эффект, зависящий от ее результата).
Оригинально! Я всё больше на перегрузки косился, а таком простом решении и не подумал. Маладца!
А мне что-то кажется, что дело здесь в побочном эффекте. ТС не помнит точно, но можно предположить, что в скробках условного оператора была более сложная конструкция, имеющая побочный эффект.
Как известно, логическое выражение в этом случае вычисляется лишь до тех пор, пока не станет ясен результат. Вполне вероятно, в выражении присутствует функция с побочным эффектом, которая в одном случае вызывается, а в другом - нет (либо вызывается в обоих случаях, но имеет побочный эффект, зависящий от ее результата).
Мне тоже казалось, что там побочный эффект, но в простом выражении. Просто, сравниваемые величины - экземпляры класса, а в классе определена операция сравнения, имеющая побочный эффект.
А можно какой нибудь пример побочного эффекта, что то я не въехал. Это полезное свойство или результат кривых рук?
Как когда.
По идее (высокой, светлой, теоретической идее) функция получает агрументы и возвращает значение. Она ничего не должна менять в "окружающем мире". Любые изменения - побочный эффект. Например:
1. Изменила глобальную переменную
2. Изменила состояние любого пина (с точки зрения программирования, пин - тоже глобальная переменная);
3. Вывела что-нибудь в сериал или ввела оттуда;
4. ну и так далее - любое изменение в глобальной среде - побочный эффект.
Как видите жить без побочных эффектов просто невозможно (тогда нужно отказаться от любого ввода/вывода). Но также часто побочный эффект - результат кривых рук. Хорошим тоном считается ограничивать побочный эффект до строго необходимого.
Кстати, любая функция с типом void не возвращает никакого значения, а значит "вызывается ради побочного эффекта" (это правильный термин для таких функций), т.к. если бы не было и его, то какой был бы смысл её вызывать?
Практических языков полностью свободных от побочного эффекта не существует (всё то же - вводить и выводить как-то надо), но эзотерические языки есть. Например, "чистый лисп" никаких побочных эффектов не имеет в принципе.