Инкремент. - страница 2

 
MetaDriver:

не прокатило :)


А должно?

Вообще, случай неопределённый, так как переменная CurRow участвует сразу и справа (неявно), и слева. Множественные инкременты и декременты (пре и пост) в одном выражении, либо неоднократное использование изменяемой переменной (этот самый случай) в одном выражении сильно зависят от реализации компилятора. Скажем, в стандарте C++ такие случаи не определены и отданы на откуп реализации.

Классика. Чему равно i после выполнения выражения?

i = i++ + ++i;

Или немножко попроще случай

i = i++;

 
Так, стоп. В MQL5 есть UB? Тогда почему вы об этом молчите?
 
TheXpert:
Так, стоп. В MQL5 есть UB? Тогда почему вы об этом молчите?


1. Не молчим. Просто как-то вопросов не возникало.

2. У нас в языке это вполне определено

 
stringo:

1. Не молчим. Просто как-то вопросов не возникало.

Ок, вопросы:

В каком порядке происходит вычисление параметров функции?

В каком порядке происходит вычисление операндов?

Ну по крайней мере на 100% они определены или нет? Потому как в С++ оптимизация довольно сильно влияет.

Ну и если есть UB, озвучьте их, пожалуйста, натыкаться на недокументированные ограничения это нехорошо, но после 4ки привычно уже как-то.

А вот словить неописанную неоднозначность в поведении... Это возможный вынос мозга.

 

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

Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении.

Постфиксные инкремент (i++) и декремент (k--) применяются к переменной сразу после использования этой переменной в выражении.

То есть, читать буквально. В случае i=3; i=i++; i останется равным 3, потому что сначала присвоение в темповую переменную, потом сразу же постинкремент, потом присвоение темповой переменной. Это, конечно же, мы добавим в справку (там и пример-то оказался скопипащенным)

1. Вычисление параметров функции происходит справа налево (в документации написано неверно, спасибо за замечание)

2. Вычисление операндов - слева направо (то есть сначала вычисляется первый операнд, потом -второй). Однако 2+2*2 не будет равно 8, так как по приоритету операций сначала будет умножение первого операнда на второй, потом только сложение самого первого операнда с результатом умножения (который становится вторым операндом)

UB у нас нет. Есть неосвещённые моменты, которые надо отыскать. В том числе с помощью выше заданных вопросов.

 
stringo:

Неоднозначность в поведении возникает только в мозгу.

Ну... В вашем же примере i = i++ + ++i. Может получиться разный результат на дебаге и релизе, это уже не в мозгу, а непосредственно в коде, такое надо знать и учитывать.

UB у нас нет. Есть неосвещённые моменты, которые надо отыскать. В том числе с помощью выше заданных вопросов.

Фух, отлегло :) .

 
TheXpert:

Ну... В вашем же примере i = i++ + ++i. Может получиться разный результат на дебаге и релизе, это уже не в мозгу, а непосредственно в коде, такое надо знать и учитывать.

Не надо так писать. За такое - расстрел сроком на 5 лет. Каждый день до смерти.
 
stringo:
Не надо так писать. За такое - расстрел сроком на 5 лет. Каждый день до смерти.
Экий жестокий. Я б больше двух не дал.
 
stringo:


А должно?

Да не, не должно. Хотя было б прикольно, если б сработало :) Лично я пробовал на полном серьёзе. Прям расстроился, кода получил l-value required :)

Вообще, случай неопределённый, так как переменная CurRow участвует сразу и справа (неявно), и слева. Множественные инкременты и декременты (пре и пост) в одном выражении, либо неоднократное использование изменяемой переменной (этот самый случай) в одном выражении сильно зависят от реализации компилятора. Скажем, в стандарте C++ такие случаи не определены и отданы на откуп реализации.

Ну согласный я. Никаких претензий нету. Чисто описал наблюдаемую феноменологию. :)

 
MetaDriver:
Да не, не должно. Хотя было б прикольно, если б сработало :) Лично я пробовал на полном серьёзе. Прям расстроился, кода получил l-value required :)

Ну согласный я. Никаких претензий нету. Чисто описал наблюдаемую феноменологию. :)



На самом деле, в результате этого обсуждения будет уточнена документация по MQL5
Причина обращения: