Ошибки, баги, вопросы - страница 2208

 

Знаменитый вопрос на собеседовании.

Что будет в i ?

int i = 5;
i = i++ + ++i;
MQL5 выдает 12. MS Visual Studio выдает 13.
 
Aleksey Rodionov:

как и в с++ вроде работает. Вот я и спросил, решил с++ почитать, например. Тоже самое значение на единицу просто в разница. Оно же вроде во втором случае "у" присваивает 5 а потом добавляет, а в первом примере сначала добавляет, а по том присваивает (долго соображал как это работает =D  )

в mql5 это равнозначные операции, в с++ разные, ниже вам привели как раз пример теста по с++ ))

 
. ... Rick D. ... .:

Знаменитый вопрос на собеседовании.

Что будет в i ?

MQL5 выдает 12. MS Visual Studio выдает 13.

Не определено из-за сайд-эффекта. В данном случае -  вообще тройного. Разные оптимизации могут по-разному вычислять значения переменных. Ради оптимизации.

 
Konstantin:

в mql5 это равнозначные операции, в с++ разные, ниже вам привели как раз пример теста по с++ ))

Откуда дровишки? Вы сравнивали результаты операций array[++i]=i и array[i++]=i?

Вопрос на засыпку. Чем отличается постфиксная операция от префиксной операции?

 
. ... Rick D. ... .:

Знаменитый вопрос на собеседовании.

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

Aleksey Rodionov:
Сижу и соображаю, как может пригодится код префиксной формы ?

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

 
Slava:

Откуда дровишки? Вы сравнивали результаты операций array[++i]=i и array[i++]=i?

Вопрос на засыпку. Чем отличается постфиксная операция от префиксной операции?

а при чем тут array[++i]=i и array[i++]=i, как я могу сравнить то, чего не было в беседе...

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

и еще, покажите тут всем указания в справке по mql про разницу в постфиксных и префиксных операций, а вот тесты прошлых лет мне говорят о том, что в mql эти операции ранее равнозначны были

ps. кстати специально сейчас проверил пример из диалога

int i = 5;
i = i++ + ++i;

билд 1816 результат == 12

 
TheXpert:

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

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

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

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

Код должен быть прозрачен и понятен с первого взгляда.

 
Georgiy Merts:

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

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

Код должен быть прозрачен и понятен с первого взгляда.

просто справку по mql5 уже пора изменить на форму соглашений и правил по языку

 
Подскажите вопрос по частичному закрытию позиции, тип счета RETAIL_HEDGING. Например я закрываю из эксперта половину позиции, должен автоматом открыться новый ордер меньшим лотом. Так вот, в какой момент новый ордер гарантированно будет в терминале? Правильно ли я понимаю, что сразу он появиться после PositionClosePartial не обязан и его нужно ловить где-нибудь в OnTrade ?
 
Konstantin:

а при чем тут array[++i]=i и array[i++]=i, как я могу сравнить то, чего не было в беседе...

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

и еще, покажите тут всем указания в справке по mql про разницу в постфиксных и префиксных операций, а вот тесты прошлых лет мне говорят о том, что в mql эти операции ранее равнозначны были

ps. кстати специально сейчас проверил пример из диалога

билд 1816 результат == 12

А при том, что примеры эти ваши - чисто теоретические. Чисто для студентов. Ни один программист в здравом уме не выпустит такое в продакшен.

Постфиксные и префиксные инкремент и декремент реально используются прежде всего в циклах. Они и называются инкремент и декремент!

Вот примеры

int i=0;
while(i<ArraySize(array))
   array[i++]=i;

и

int i=0;
while(i<ArraySize(array))
   array[++i]=i;

Если Вы утверждаете, что префиксные и постфиксные операции работают одинаково, то флаг Вам в руки и барабан на шею.

В случае с префиксным инкрементом, вы получите неинициализированным нулевой элемент массива и ошибку array out of range на последней итерации.


PS. Решил перечитать нашу документацю по этому вопросу по зелёной ссылке https://www.mql5.com/ru/docs/basis/operations/mathoperation

Важное замечание

int i=5;
int k = i++ + ++i;

Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в другую (например, из Borland C++ в MQL5). В общем случае порядок вычислений зависит от реализации компилятора. На практике существуют два способа реализации постдекремента (постинкремента):

  1. постдекремент (постинкремент) применяется к переменной после вычисления всего выражения;
  2. постдекремент (постинкремента) применяется к переменной сразу по месту операции.

В MQL5 в данный момент реализован первый способ вычисления постдекремента (постинкремента). Но даже обладая этим знанием лучше не экспериментировать с использованием данной тонкости.

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
Причина обращения: