文章 "掌握 MQL5:从入门到精通(第二部分)基本数据类型和变量的使用" - 页 2

 
Oleh Fedorov #:

咳咳...我不好意思问,但我有....。

  • 这种结构在实际的 MQL5 代码中出现的频率如何?
  • "六月采访"...这是否意味着您本人遇到过以 MQL 为主要活动领域之一的大公司?(就我个人而言,迄今为止还没有遇到过)。
  • 这些代码会在所有类 c 语言中产生相同的结果吗?

简而言之,为什么一个新手需要对字面有如此 深刻的理解?


附注:我个人虽然不是新手,但也没有答对你的测试题。我在 Java 或 PHP 的教科书中见过类似的内容,但那是很久以前的事了,与我现在读写的实际代码不符......我不会成为你办公室里的 "六月天"。还有......什么?

附注:我认为如果您写一篇关于字面的文章,可能不仅对我有用。;-)特别是如果您能分享您的经验,而这些经验并不在帮助....。不过,没有文档的功能通常会让我很尴尬,因为它们 在新版本中变化太频繁了,但是,你永远不会知道....。也许它真的很重要,或者至少很有用?

你看。问题不在于它发生的频率,而在于人们不知道也不想知道其中的奥妙。关于引入类型,你需要知道这一点,因为这是基础的基础。通过它,你可以减轻很多痛苦。顺便说一句,这段代码并不是关于类型转换的,而是供你思考的:

enum E{
   int a;
   float b;
}

double F(E& e, int a){
   e.a = a;
   return e.b;
}

因此,根据帮助,这里一切正常。只是,就我个人而言,还有一个细微差别。根据开发者的说法,mql 是用 C++ 编写的,在 C++ 中你不能这么做,这是 UB,但在 C 语言中一切都是合法的。我经常在 pluses 上看到这样的代码,是的,它可以运行,但就我个人而言,我害怕这样写,但 mql 开发人员是否害怕,我就不知道了。这就是为什么我永远不会在 mql 中这样做,因为我不知道实现方法。

 
Vladimir Simakov #:


根据开发人员的说法,mql 是用 C++编写的,在 C++ 中你不能这么做,这是 UB,但在 C 语言中一切都是合法的。

很抱歉,开发人员声称 MQL 编程语言尽可能接近 C++,而 不是用C++ 编写的。))

问候,弗拉基米尔。

 
Vladimir Simakov #:
关于类型转换,你必须知道,因为它是基础知识的基础。

我甚至不想争论这个问题。我完全同意。只是...并不是所有的 C 结构在 MQL 中都同样有用!:-)

关于 "思考 "代码...由于我不熟悉 C 语言(两个都不熟悉),这段代码在我看来就像一场游戏。在帮助中, 枚举 类型指的是整数类型,我甚至不认为它是一种结构。它的含义完全不同......不过谢谢你,现在我知道了--虽然这对我个人没什么用,但我根本不会使用它 :-)。

所以,根据帮助,这里一切正常。

能给我一个链接吗?

Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
  • www.mql5.com
Данные перечислимого типа enum относятся к некоторому ограниченному множеству данных. Определение перечислимого типа: Список значений представляет...
 
Oleh Fedorov #:

关于 "思考 "代码...由于我对 C 语言(两种语言)都不熟悉,这段代码 在我看来就像是在玩游戏。在帮助中, 枚举 类型指的是整数类型,我甚至不认为它是一种结构。它的含义完全不同......不过谢谢你,现在我知道了--虽然这对我个人没什么用,但我不会使用这种东西 :-)。

这就是游戏。一定是有人从天花板上写起,混淆了 enum 和 union。他的例子无法编译。枚举不是一个结构,而是一个 4 字节的整数。如果使用 union,它在 C++ 和 MQL 中就能很好地运行。

PS.关于 Jun 采访中的第一个例子,以及关于这种情况经常发生的问题--当然,这种情况不会以纯粹的形式发生,因为这个例子是经过提炼的,但有符号整数和无符号整数经常在代码中混合使用,这里很可能会出现问题。
 
Stanislav Korotky #:

这是无稽之谈。这个人一定是从天花板上写的,把 enum 和 union 搞混了。他的例子无法编译。枚举不是一个结构,而是一个 4 字节的整数。如果使用 union,它在 C++ 和 MQL 中就能很好地工作。

PS.关于 Jun 采访中的第一个例子,以及经常出现这种情况的问题--当然,这种情况不会以纯粹的形式出现,因为这个例子是经过改进的,但有符号和无符号整数经常在代码中混合使用,这里很可能会出现问题。

自然工会)))))

关于其他部分:https://en.cppreference.com/w/cpp/language/union

It is undefined behavior to read from the member of the union that wasn't most recently written. 

是的,我知道接下来会说什么

Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union.

不过,msvs(它的帮助文件)并没有提出第二条,尽管还没有人遇到过。g++ 和 clang 没看过它们是怎么说的,但几乎没有什么不同。

如果你想这么用,那就用吧--这是你的权利,也是你的痛苦,如果出了什么事的话)))。

 
Vladimir Simakov #:

自然))))

关于其他内容:https://en.cppreference.com/w/cpp/language/union

cppreference 是一个有用的资源,但由于其参考性质,它无法包含只有在语言规范中才能找到的所有细微差别。要概括这些细微差别,查看stackoverflow 会更容易,作为总结--对于原始类型,在读取字段时,即使字段未被写入,也会保证按位 "转移 "值。

Accessing inactive union member and undefined behavior?
Accessing inactive union member and undefined behavior?
  • 2012.07.07
  • Luchian Grigore Luchian Grigore 257k 66 66 gold badges 461 461 silver badges 626 626 bronze badges
  • stackoverflow.com
I was under the impression that accessing a member other than the last one set is UB, but I can't seem to find a solid reference (other than answers claiming it's UB but without any support from the standard). So, is it undefined behavior?
 
Stanislav Korotky #:

这是无稽之谈。这个人一定是从天花板上写的,把 enum 和 union 搞混了。他的例子无法编译。枚举不是一个结构,而是一个 4 字节的整数。如果使用 union,它在 C++ 和 MQL 中就能很好地运行。

PS.关于 Jun 采访中的第一个例子,以及关于这种情况经常发生的问题--当然,这种情况不会以纯粹的形式发生,因为这个例子是经过改进的,但有符号和无符号整数经常在代码中混合使用,这里很可能会出现问题。

呼,世界图景恢复了!:-)我正在完成有关联合和其他复杂类型的工作(如果没有更多失误,希望下周就能完成)。

附注:MetaEditor 不会高亮显示带有后缀 `u` 和 `ull` 的字面量,但会编译它们。同时,它高亮显示了 `f` 但却报告了一个错误....。不知道这是错误还是提示?:-)

 

如果您是初学者,对我们的辩论感到困惑,请允许我解释一下,在 C 语言(以及 C++)中,您可以为数字字面量添加后缀,从而改变数据类型。例如,后缀 `u` 可以将普通整数(int) 变为无符号整数(uint)。

请尝试执行Vladimir Simakov 建议的稍作修改的脚本(注意数字和字母之间不要有空格 ,这很重要):

void OnStart()
  {
//---
    
   Print(typename(1));
   Print(typename(-1));
   Print(typename(1 ll));
   
   Print(typename(1 u));
   Print(typename(1 ull));
   
   Print(typename(-1*1 ull));
   
   Print(typename(NULL));
   
   
   Print(-1<1 u); 
   Print(-1*1 ull);
  }

该脚本的第一行输出在MQL5 中编译的某些字面量的类型名称。

我可能没有编译所有工作后缀,希望 C 语言专家能指正。请根据文章材料、脚本输出和我们的讨论尝试理解其中的逻辑,如果有任何不清楚的地方,请提出问题。

Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
  • 2024.06.11
  • Vladimir Simakov
  • www.mql5.com
Опубликована статья Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных : Автор: Oleh Fedorov...