Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях - страница 31

 
Alexey Viktorov:

А можете пояснить, почему должно быть предупреждение?

Эти два выражения для штатных типов имеют всегда однозначное значение.

(i == i) // true
(i != i) // false


Когда в коде хочется четкие true/false, то так и прописывают. В данном же случае вероятна подобная опечатка.

i == j
i != j
 
fxsaber:

Эти два выражения для штатных типов имеют всегда однозначное значение.

это не так

по крайней мере для double не всегда будет работать, если в double будет NaN


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

ЗЫ: проверил на всякий случай в VS2019 в С++ коде Ваш пример тоже не выдает предупреждений

 
Igor Makanu:

для double не всегда будет работать, если в double будет NaN

Не знал, спасибо.

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

Целочисленная переменная сравнивается с собой же. Не думал, что это сложно видеть.

 
fxsaber:

Не знал, спасибо.

забыли просто https://www.mql5.com/ru/forum/170952/page144#comment_13694340

fxsaber:

Целочисленная переменная сравнивается с собой же. Не думал, что это сложно видеть.

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

 
Igor Makanu:

забыли просто https://www.mql5.com/ru/forum/170952/page144#comment_13694340

Прочел. Ужас.

 
fxsaber:

Не знал, спасибо.

Целочисленная переменная сравнивается с собой же. Не думал, что это сложно видеть.

так она(Целочисленная переменная) не знает что сравнивается с собой(ИМХО), проверяется истинность по значениям(ИМХО).

 
Ilyas:
Спасибо, уже исправлено.

Не хватает билда с исправлением крашей.

 
Igor Makanu:

забыли просто https://www.mql5.com/ru/forum/170952/page144#comment_13694340

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

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

например такой код выдает предупреждение компилятора:

uint ui=2;
if(ui<0) ui++; //warning: "expression is always 'false'"

Так что предложение fxsaber  не лишено оснований.

 
И я почему-то уверен, что на оптимизации код (i==i) для целого i будет автоматом заменен на true.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях

mktr8591, 2021.08.24 12:56

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

например такой код выдает предупреждение компилятора:

uint ui=2;
if(ui<0) ui++; //warning: "expression is always 'false'"

Так что предложение fxsaber  не лишено оснований.


это лишь проверка на допустимые значения для типа 

мой пример тож компилятор прекрасно отследит:

char a = 0;
if(a > 1234567890) Print(">"); // expression is always 'false'

mktr8591:
И я почему-то уверен, что на оптимизации код (i==i) для целого i будет автоматом заменен на true.

можно попробовать проверить  по размеру .ex5 - после if() сохранить в string несколько кб текста и вывести Print() , размер .ex5 будет значительно отличаться если Ваше предположение верно

Причина обращения: