初学者的问题 MQL5 MT5 MetaTrader 5 - 页 495

 

关于第一种情况已经解决了--放在括号里的两个比较,它不发誓--是否有一个逻辑错误--即比较的结果可以被替换,因为 "或"?

第二种表达方式仍有一个开放性问题--那里有什么问题--有什么想法吗?

 
-Aleks-:

第一种情况已经解决了--把两个比较结果放在括号里,它并不发誓--是否存在一个逻辑错误--即比较结果可以因为 "或 "而被替换?

关于第二种表达方式仍有一个未决问题--那里有什么问题--有什么想法吗?

记住,在新的mql4中对一个条件的检查并没有完全执行。即在条件

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

如果Low[x]不大于PriceBuy,那么将不进行进一步检查。这就是错误描述告诉我们的内容。相应地,如果第一对条件被括在括号内,第二对条件如果失败,将被检查。

第二个问题。

for(calc_day;calc_day>0; calc_day--)

calc_day等于什么?可以小于零吗?编译器不知道逻辑中的内容...这就是为什么它警告说可能出现无效的循环。

 
Alexey Viktorov:

记住,新的mql4中的条件检查并没有完全执行。即,在条件

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

如果Low[x]不大于PriceBuy,将不进行进一步检查。这就是错误描述告诉我们的内容。相应地,如果第一对条件被括在括号内,第二对条件如果失败,将被检查。

谢谢你的答复

惊讶--因为在视觉上,这个逻辑一直在正常工作,嗯......。


阿列克谢-维克多罗夫

第二个问题。

for(calc_day;calc_day>0; calc_day--)

calc_day等于什么?可以小于零吗?编译器不知道逻辑中的内容...这就是为什么它警告说可能出现无效的循环。

数字calc_day总是大于0,其他数值时代码不被调用。
 
-Aleks-:

谢谢你的答复

惊讶--因为在视觉上,这个逻辑一直在正常工作,嗯......。

在6**构建之前是这样的,检查了整个条件链,一切正常,但现在一切都变了。而在旧的构建中,这种情况下条件是模糊的。它是如何设计的?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

或者是这样?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

一个人的大脑可以搞清楚,但一个编译器该怎么做?它没有大脑。

-Aleks-

数字calc_day总是大于0,其他数值不会导致代码被调用。

告诉编译器...

 
Alexey Viktorov:

直到构建6**都是如此,整个条件链都被检查过,一切都在工作,但现在一切都变了。而在旧的建筑中,这种情况下的条件也是模糊不清的。它是如何设计的?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

或者是这样吗?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

一个人的大脑可以搞清楚,但一个编译器该怎么做?他没有大脑...


告诉编译器...

令人信服 - 我会更加警惕。

我如何告诉编译器?写吧,但它能理解吗?

if (calc_day<0)  calc_day=calc_day*(-1);

 
Alexey Viktorov:

在6**构建之前是这样的,整个条件链都被检查过了,一切都正常,但现在一切都变了。是的,在这种情况下,在旧的建设中,条件是模糊的。它是如何设计的?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

或者是吗?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

一个人的大脑可以搞清楚,但一个编译器该怎么做?他没有大脑...


告诉编译器...

检查运算符的优先级是否可能出错;使用括号来澄清优先级 --这不是一个错误 这是一个警告。它出现在旧代码中。

他们是为用户而不是为编译器添加的。编译器以操作优先级 为指导。那里一切都很清楚。&&的优先级高于||的优先级。 这就是为什么括号应该这样排列的原因

if( (Low[X]>PriceBuy &&High[X]>PriceBuy) || ( Low[X]<PriceBuy &&High[X]<PriceBuy) )

更新:在这种情况下,MT4和MT5的优先级是一样的。

 
-Aleks-:

令人信服 - 我会更加警惕。

我如何告诉编译器?写吧,但它能理解吗?

if (calc_day<0)  calc_day=calc_day*(-1);

for( calc_day = 365; calc_day > 0; calc_day --)
那就试试吧。
 
Alexey Kozitsyn:

检查运算符的优先级是否可能出错;使用括号来澄清优先级 --这不是一个错误 这是一个警告。它出现在旧代码中。

我们是为用户而不是为编译器添加的。编译器以操作优先级 为指导。那里一切都很清楚。&&的优先级高于||的优先级。 这就是为什么括号应该这样排列的原因

if( (Low[X]>PriceBuy &&High[X]>PriceBuy) || ( Low[X]<PriceBuy &&High[X]<PriceBuy) )

更新:在这种情况下,MT4和MT5的优先级是一样的。

从本质上讲,是的,警告不是一个错误。但如果( Low[X]>PriceBuy &&High[X]>PriceBuy || Low[X]<PriceBuy &&High[X]<PriceBuy ),初始变量将如何工作还是说放几个支架就很无奈了?

 
-Aleks-:

令人信服 - 我会更加警惕。

我如何告诉编译器?写吧,但它能理解吗?

if (calc_day<0)  calc_day=calc_day*(-1);

for(int i=calc_day; i>0; i--) {}
 
Alexey Viktorov:

嗯,从本质上讲,是的,警告不是错误。但如果( Low[X]>PriceBuy &&High[X]>PriceBuy || Low[X]<PriceBuy &&High[X]<PriceBuy ),初始变量将如何工作还是会因为放了几个托架而失败?

它将按照我上面写的方式工作。

编译器警告用户不要偷懒,放上括号以避免可能的非明显错误。