错误、漏洞、问题 - 页 2208

 

著名的求职面试问题。

哪些东西会出现在i?

int i = 5;
i = i++ + ++i;
MQL5输出 12.MSVisual Studio 输出 13.
 
Aleksey Rodionov:

因为它在C++中似乎是有效的。所以我问了一下,决定以C++为例进行阅读。相同的价值由一个只是差异。在第二种情况下,似乎是将5分配给 "y",然后再加上,而在第一个例子中,则是先加上,然后再分配(我花了很长时间才弄清楚它是如何工作的 =D )

在mql5中它们是平等的操作,在c++中它们是不同的,下面只是给了你一个关于c++的测试例子))

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

著名的求职面试问题。

哪些东西会出现在i?

MQL5给出了12。 MS Visual Studio给出了13。

因为有副作用,所以没有定义。在这种情况下,完全是一种三重效应。不同的优化方法可能会以不同的方式计算变量值。出于优化的考虑。

 
Konstantin:

在mql5中它们是等价的操作,在c++中它们是不同的,下面只是给了你一个关于c++的测试例子))

你从哪里得到它的?你有没有比较过array[++i]=i和array[i++]=i的操作结果

这里有一个谜题给你。后缀操作和前缀操作之间有什么区别?

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

工作面试中的一个著名问题。

一个愚蠢的、不必要的问题,只显示被采访者是否知道什么是UB,与讨论的话题没有什么关系。

阿列克谢-罗季奥诺夫
我坐在这里想,前缀形式的代码怎么能派上用场?

编译器有足够的头脑在需要时优化后缀形式。

 
Slava:

你从哪里得到的投入?你有没有比较过array[++i]=i和array[i++]=i操作结果

这里有一个令人费解的问题。后缀操作和前缀操作之间有什么区别?

array[++i]=i和array[i++]=i 有什么关系,我怎么能比较没有在对话中出现过的东西...

如果在争议的框架内,mql有一些变化,而你又知道,那么你作为主持人,有义务告知对话的参与者,而不是试图做语法知识测试,这绝对不是你的职责...

而且,在mql帮助中显示了所有关于后缀和前缀操作的说明,但前几年的测试表明,这些操作在mql中是等同的

顺便说一下,我刚刚检查了对话框中的例子

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

build 1816 result == 12

 
TheXpert:

这是一个愚蠢的、不必要的问题,它只揭示了受访者是否知道什么是UB,与讨论的主题没有什么关系。

嗯,实际上前缀的形式更快。

此外,我认为在你的代码中使用这样的结构是不可接受的。

首先,因为在不同的实现中工作的模糊性,更因为在这样的代码中很容易出错,而要弄清它的意义则不那么容易。

代码应该是透明的,可以一目了然。

 
Georgiy Merts:

此外,在我看来,在代码中使用这样的结构是完全不可接受的。

首先,因为在不同的实现上工作的模糊性,甚至更多--因为在这样的代码中很容易犯错,而且不容易理解。

代码应该是透明的,可以一目了然。

是时候把mql5的帮助改为语言惯例和规则的形式了

 
请告知部分平仓 的情况,账户类型为RETAIL_HEDGING。例如,我在专家顾问中关闭了一半的头寸,一个较小手数的新订单应该自动打开。那么,在什么时候,新的订单才能保证进入终端?我是否正确地理解,它不必立即出现在PositionClosePartial之后,而必须在OnTrade的某个地方被捕获?
 
Konstantin:

array[++i]=i和array[i++]=i 有什么关系,我怎么能比较对话中没有发生的...

如果在争端的框架内,mql有变化,而且你知道,那么作为主持人,你有义务把它带给对话的参与者,而不是试图进行语法知识测试,这绝对不是你的职责...

而且,在mql帮助中显示了所有关于后缀和前缀操作的说明,但前几年的测试表明,这些操作在mql中是等同的

顺便说一下,我刚刚检查了对话中的例子

build 1816 result == 12

但你的例子纯粹是理论上的。它们只为学生准备。没有一个头脑正常的程序员会将它们发布到生产中。

后缀和前缀的增量 和减量实际上首先在循环中使用。而它们被称为增量和减量!

这里有一些例子

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

и

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

如果你声称前缀和后缀操作的工作方式相同,那么,请在你的手中举旗,在你的脖子上打鼓。

在前缀递增的情况下,你会得到一个未初始化的空数组元素,并且在最后一次迭代时出现数组超范围的错误。


PS。决定重读我们关于这个问题的文档,在绿色链接https://www.mql5.com/ru/docs/basis/operations/mathoperation

重要说明

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

当把上述表达式从一个编程环境移植到另一个环境时(例如,从Borland C++到MQL5),你可能会遇到计算问题。在一般情况下,计算的顺序取决于编译器的实现。在实践中,有两种实现后减法(后增法)的方法。

  1. postdecrement (postincrement)是在整个表达式计算完毕后应用于变量的。
  2. postdecrement(postincrement)被应用于紧邻操作地点的变量。

在MQL5中,我们目前实现了计算后减(后增)的第一个方法。但即使有了这些知识,最好也不要尝试使用这招。

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