错误、漏洞、问题 - 页 2521 1...251425152516251725182519252025212522252325242525252625272528...3184 新评论 Alexey Navoykov 2019.07.30 19:10 #25201 fxsaber: Подскажите, как в C++ с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах. b = a; a = b; // OK 第一个任务只在MQL中起作用。而且太糟糕了,它是有效的。 我希望他们最终能废除这个误解。 第二个没有问题。 fxsaber 2019.07.30 19:30 #25202 Alexey Navoykov: 第一个任务只在MQL中工作。我希望他们最终能取消这个误会。 我对第二个没有问题。 这很奇怪。我以为第一种方法一定有效,而第二种方法则无效。 Alexey Navoykov 2019.07.30 19:56 #25203 fxsaber: 这很奇怪。我以为第一种方法一定有效,而第二种方法则无效。 嗯,显然,MQL的开发者们也不太理解赋值的本质。因为我已经告诉他们这个问题很长时间了,但却碰了壁。 赋值的本质是为对象分配一个等价的 对象。这意味着右边的对象首先被隐含地投递到左边对象的类型中,然后才进行赋值(复制)。 而在第一种情况下,这种投递(A->B)肯定是不可能的。在C++中会有一个错误,但在MQL中,左边的对象被投到右边的对象,A::operator=(A&)被执行,只替换了b对象的一部分。 这是一个分配吗? 想象一下,你正在将int赋值给long,但只有前四个字节被替换,其余的没有被触动。 这里也是如此。 fxsaber 2019.07.30 20:04 #25204 Alexey Navoykov: 想象一下,你把一个int赋值给一个long,但只有前四个字节被替换,其余的都没有动过。 这里也是一样。 所以它很方便,我想。当然,是在结构的范围内。 Alexey Navoykov 2019.07.30 20:33 #25205 fxsaber: 所以它很方便,似乎。当然,是在结构的范围内。 它可能会在字符串中保存字符,但它是随机错误的来源,并使对代码的理解变得复杂/扭曲。正如上面所说的,等号有一个明确无误的含义,即整个 对象被改变。 这就是为什么在这种情况下,操作符没有按照预期使用。 如果你想要这种非标准行为,你应该为这种目的重载操作符。 p.s. 唯一的例外是,如果类B没有自己的字段,也就是说,它和类A完全一样(完全等同于它),那么就没有理由阻止这种赋值,尽管它在C++中无论如何都是不起作用的,但在MQL中你可以允许它。 fxsaber 2019.07.30 20:36 #25206 Slava: 在opt文件中,在规定了所有输入参数的大块中,优化参数的值(通过大小和偏移量字段定义)不包含Value(如同没有优化),而是包含Start。 在那里设置 "价值 "是符合逻辑的。 A100 2019.07.30 21:57 #25207 Alexey Navoykov: 好吧,看来MQL开发人员也不太理解赋值的本质。因为我已经告诉他们这个问题很长时间了,但却碰了壁。 赋值的本质是为对象分配一个等价的 对象。换句话说,属于同一类型。 用户类型的操作的本质没有事先定义。而且只定义了它们的顺序,在这种情况下,它包括调用适当的操作符=。 在MQL中,与C++不同,operator=是继承的,所以b = a; 等于调用A::operator=(const A&)。 一般来说,这里不存在矛盾。在分配等价物的特殊情况下,有一些实体的不一致,但也不过如此 Alexey Navoykov 2019.07.30 22:28 #25208 A100: 在MQL中,与C++不同,operator=是继承的,所以b = a;等同于调用b.operator=(const A&)。 嗯,是的,这就是问题所在。但写作上的差异在这里并不起作用。 在C++中,这两种情况下都不会编译。 一般来说,这里不存在矛盾。在分配同等对象的特殊情况下,存在一些实体的不一致情况 至少在C++中会有矛盾。 如果它能编译,就意味着右操作数被隐含地转换为左操作数,然后对对象进行完整的替换,这在逻辑上应该是可行的。 我举了一个int->long的例子。 而对对象内部的部分替换并不是赋值。 所以既有矛盾也有不一致的地方。 p.s. 虽然我们也可以重载操作符B::operator=(A&),但我想一个明智的程序员会在那里完全替换B对象,而不是部分替换,因为这是赋值的本质。 如果想要简洁的拼写,可以为其制作一些其他的运算符:例如&=或|=。 至少它们不常用,所以不会产生混淆。 [删除] 2019.07.30 22:51 #25209 Alexey Navoykov: .......... 矛盾的是,至少与C++。...... .......... 是什么让你认为MQL必须完全等同于C++呢? C-like并不意味着等同于! MQL是为明确的任务而开发的,没有义务完全复制它所依据的语言。 你能不能不要再愤愤不平了? 但在Pascal中,你可以......... 在Assembler中,你可以进入..... 而在Java .... 而在BASIC .... 你在这里练习比较语言吗? ======= P.S. 不仅仅是你... Alexey Navoykov 2019.07.30 23:02 #25210 Сергей Таболин: 是什么让你认为MQL应该与C++完全兼容呢? ... 你在这里练习比较语言吗? 我是在回应一个具体的短语。冷静下来。吃点缬草,然后去睡觉。 担心对你没有好处。...有些人一听到 "C++"这个词就会热血沸腾。 1...251425152516251725182519252025212522252325242525252625272528...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
fxsaber:
Подскажите, как в C++ с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.
b = a; a = b; // OK第一个任务只在MQL中起作用。而且太糟糕了,它是有效的。 我希望他们最终能废除这个误解。 第二个没有问题。
第一个任务只在MQL中工作。我希望他们最终能取消这个误会。 我对第二个没有问题。
这很奇怪。我以为第一种方法一定有效,而第二种方法则无效。
这很奇怪。我以为第一种方法一定有效,而第二种方法则无效。
嗯,显然,MQL的开发者们也不太理解赋值的本质。因为我已经告诉他们这个问题很长时间了,但却碰了壁。
赋值的本质是为对象分配一个等价的 对象。这意味着右边的对象首先被隐含地投递到左边对象的类型中,然后才进行赋值(复制)。 而在第一种情况下,这种投递(A->B)肯定是不可能的。在C++中会有一个错误,但在MQL中,左边的对象被投到右边的对象,A::operator=(A&)被执行,只替换了b对象的一部分。 这是一个分配吗?
想象一下,你正在将int赋值给long,但只有前四个字节被替换,其余的没有被触动。 这里也是如此。
想象一下,你把一个int赋值给一个long,但只有前四个字节被替换,其余的都没有动过。 这里也是一样。
所以它很方便,我想。当然,是在结构的范围内。
所以它很方便,似乎。当然,是在结构的范围内。
它可能会在字符串中保存字符,但它是随机错误的来源,并使对代码的理解变得复杂/扭曲。正如上面所说的,等号有一个明确无误的含义,即整个 对象被改变。 这就是为什么在这种情况下,操作符没有按照预期使用。 如果你想要这种非标准行为,你应该为这种目的重载操作符。
p.s. 唯一的例外是,如果类B没有自己的字段,也就是说,它和类A完全一样(完全等同于它),那么就没有理由阻止这种赋值,尽管它在C++中无论如何都是不起作用的,但在MQL中你可以允许它。
在opt文件中,在规定了所有输入参数的大块中,优化参数的值(通过大小和偏移量字段定义)不包含Value(如同没有优化),而是包含Start。
在那里设置 "价值 "是符合逻辑的。
好吧,看来MQL开发人员也不太理解赋值的本质。因为我已经告诉他们这个问题很长时间了,但却碰了壁。
赋值的本质是为对象分配一个等价的 对象。换句话说,属于同一类型。
用户类型的操作的本质没有事先定义。而且只定义了它们的顺序,在这种情况下,它包括调用适当的操作符=。
在MQL中,与C++不同,operator=是继承的,所以b = a; 等于调用A::operator=(const A&)。
一般来说,这里不存在矛盾。在分配等价物的特殊情况下,有一些实体的不一致,但也不过如此
在MQL中,与C++不同,operator=是继承的,所以b = a;等同于调用b.operator=(const A&)。
嗯,是的,这就是问题所在。但写作上的差异在这里并不起作用。 在C++中,这两种情况下都不会编译。
一般来说,这里不存在矛盾。在分配同等对象的特殊情况下,存在一些实体的不一致情况
至少在C++中会有矛盾。 如果它能编译,就意味着右操作数被隐含地转换为左操作数,然后对对象进行完整的替换,这在逻辑上应该是可行的。 我举了一个int->long的例子。 而对对象内部的部分替换并不是赋值。 所以既有矛盾也有不一致的地方。
p.s. 虽然我们也可以重载操作符B::operator=(A&),但我想一个明智的程序员会在那里完全替换B对象,而不是部分替换,因为这是赋值的本质。
如果想要简洁的拼写,可以为其制作一些其他的运算符:例如&=或|=。 至少它们不常用,所以不会产生混淆。
..........
矛盾的是,至少与C++。......
..........
是什么让你认为MQL必须完全等同于C++呢?
C-like并不意味着等同于!
MQL是为明确的任务而开发的,没有义务完全复制它所依据的语言。
你能不能不要再愤愤不平了?
但在Pascal中,你可以.........
在Assembler中,你可以进入.....
而在Java ....
而在BASIC ....
你在这里练习比较语言吗?
=======
P.S. 不仅仅是你...
是什么让你认为MQL应该与C++完全兼容呢?
...
你在这里练习比较语言吗?
我是在回应一个具体的短语。冷静下来。吃点缬草,然后去睡觉。 担心对你没有好处。...有些人一听到 "C++"这个词就会热血沸腾。