Бессмысленная конструкция?

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

Постоянно всплывает в памяти конструкция, которую как-то увидел на каком-то сайте в программе (жаль, не могу найти сейчас) и так и не понял. Выглядело всё примерно так:

if (a > b) c = d; else c = d;

Вроде бессмыслица, но стоило её убрать и заменить на

c = d;

что, вроде бы, тоже самое, как программа переставала работать как надо.

Кто-нибудь может объяснить, такое возможно? Или ... ну, вроде я тогда ничего не курил.

Нет-нет да вспомнится и покоя не даёт.

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

1. Судя по написанному, Вы не готовы поручиться, что конструкция была именно такой.

2. Вы привели лишь небольшую часть кода, в полном коде может оказаться нечто, сушественно меняющее смысл конструкций.

3. Вы привели код примерно. Не может оказаться так, что где-то используются не простые переменные, а функции?

4. Ардуино использует сильно оптимизирующий компилятор, который, возможно, вырезает нечто, что с первого раза неочевидно.

5. Не объявлены ли какие-нибудь из используемых переменных как volatile?

6. Бывает, в программе нужна небольшая задержка по времени, без которой не работает, и которая, порой, реализуется весьма нестандартными способами.

7. Ну и, наконец, в Инете масса программ, содержащих самые разные ошибки.

Какой вариант из приведенных Вам больше нравится?

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

if (a > b) c = d; else c = d;

На мой взглюд здесь есть 3 варианта

1 a>b

2 a<b

3 a=b

Может как раз третий и выбивает программу?

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

2 и 3 - одна и та же ветка условного оператора.

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

vosara пишет:

3 a=b

Может как раз третий и выбивает программу?

Чем? Ну, срабатывает ветка "else", дальше-то что?

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

Присоединюсь к 

andriano пишет:

2. Вы привели лишь небольшую часть кода, в полном коде может оказаться нечто, сушественно меняющее смысл конструкций.

Если предположить, что код запомнен и воспроизведён правильно, и что он действительно по своему поведению отличается от "c=d", то надо признать, что ничего нельзя сказать, если не знать, как объявлены переменные.

Нет никаких воспоминаний об этом?

Так-то, придумать этому коду "начало", чтобы всё было действительно так, как Вы написали, несложно, но ... тут у меня проблема ... придумать-то я могу специально. Но это будет языковое извращение. А вот предположить разумный код, где такое языковое извращение могло бы быть реально полезным и оправданным - так с ходу у меня не получается. Но само по себе, такое, конечно, возможно.

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

if (a != b) c = d;

else c=25;

А такая конструкция?

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

Что "такая"?

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

Ошибочка!

"andriano" 2 и 3 - одна и та же ветка условного оператора.

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

Да, мужики, мой грех не сохранил и не знаю как там они описаны были.

Но говорите, что возможно такое? Чтобы вот так всё было (при каком-то описании переменных), да?

Спасибо, буду думать как именно такое можно сделать.

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

Ну, это правильный подход, думайте. Если что надумаете, покажите, интересно посмотреть, что у Вас получится. В том, что это возможно не сомневайтесь - возможно и не такое :)

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

vosara пишет:

Ошибочка!

"andriano" 2 и 3 - одна и та же ветка условного оператора.

Что Вы хотите этим сказать?

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

Что я ошибся

uno
Offline
Зарегистрирован: 16.06.2016

1 и 2 код дают 1 и тотже результат но за разное время может программисту была нужна эта микрозадержка.

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

когде делей иногда и пустыми цыклами особенно есл иработаю какието исполнительные механизмя со скоростью 30-120 тактов в секунду

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

Может и так. При желании-то они и разный результат могут давать, только вот я никак не могу придумать для чего бы это было нужно. Ваше объяснение (типа результат один, но за разное время) интересно, но опять же ... мягко говоря экзотический способ организации задержки :)

Т.е. мне кажется главный вопрос "а нафига?" так и остаётся открытым.

arduinec
Offline
Зарегистрирован: 01.09.2015

А если так?

if (a > b) c = d1; else c = dl;

Первая d с цифрой 1, вторая - с буквой L.

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

Ну, это совсем другое, я понял вопрос ТС так, должно быть одинаково.

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

Да, должно быть одинаково.

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

// ТУТ ЧТО_ТО

   if (a > b) c = d; else c = d;
   Serial.println(c);
}

и при этом его работа (например, то, что пишется в сериал) отличалось бы от работы скетча

// ТУТ ТОЖЕ САМОЕ, ЧТО И В СКЕТЧЕ ВЫШЕ

   c = d;
   Serial.println(c);
}

Мне как вчера andriano c Евгением сказали, что это возможно, так я уже всю лысину прочесал.

Дайте маленькую подсказку. По каким ключевым словам искать нужные средства?

Logik
Offline
Зарегистрирован: 05.08.2014

Курите перегрузку операции присвоения.

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

Можно и так, но я бы покурил перегрузку операции сравнения. И не забывать про "побочный эффект".

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

Ага, спасибо, приступаю к раскурке перегрузки операторов и побочного эффекта (последнее еле нашёл, всё фильм вылазит)

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

Ворота пишет:

приступаю к раскурке перегрузки операторов

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

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

#define if(p) if(rand(50)&&(p))

В смысле из той же оперы..

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

arduinec пишет:

А если так?

if (a > b) c = d1; else c = dl;

Первая d с цифрой 1, вторая - с буквой L.


Ага, а с во втором случае русская))))

Datak
Offline
Зарегистрирован: 09.10.2014
   #define a (++d)
   int b = 0;
   int c;
   int d = 0;

   c = d;
   Serial.println(c);

   if (a > b) c = d; else c = d;
   Serial.println(c);
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

uno пишет:

1 и 2 код дают 1 и тотже результат но за разное время может программисту была нужна эта микрозадержка.

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

когде делей иногда и пустыми цыклами особенно есл иработаю какието исполнительные механизмя со скоростью 30-120 тактов в секунду

Пост 1 пункт 6.

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

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

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

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

Datak пишет:

   #define a (++d)
   int b = 0;
   int c;
   int d = 0;

   c = d;
   Serial.println(c);

   if (a > b) c = d; else c = d;
   Serial.println(c);

Оригинально! Я всё больше на перегрузки косился, а таком простом решении и не подумал. Маладца!

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

andriano пишет:

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

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

Мне тоже казалось, что там побочный эффект, но в простом выражении. Просто, сравниваемые величины - экземпляры класса, а в классе определена операция сравнения, имеющая побочный эффект.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

А можно какой нибудь пример побочного эффекта, что то я не въехал. Это полезное свойство или результат кривых рук?

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

Mr.Privet пишет:
Это полезное свойство или результат кривых рук?

Как когда.

Mr.Privet пишет:
А можно какой нибудь пример побочного эффекта

По идее (высокой, светлой, теоретической идее) функция получает агрументы и возвращает значение. Она ничего не должна менять в "окружающем мире". Любые изменения - побочный эффект. Например:

1. Изменила глобальную переменную
2. Изменила состояние любого пина (с точки зрения программирования, пин - тоже глобальная переменная);
3. Вывела что-нибудь в сериал или ввела оттуда;
4. ну и так далее - любое изменение в глобальной среде - побочный эффект.

Как видите жить без побочных эффектов просто невозможно (тогда нужно отказаться от любого ввода/вывода). Но также часто побочный эффект - результат кривых рук. Хорошим тоном считается ограничивать побочный эффект до строго необходимого.

Кстати, любая функция с типом void не возвращает никакого значения, а значит "вызывается ради побочного эффекта" (это правильный термин для таких функций), т.к. если бы не было и его, то какой был бы смысл её вызывать?

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