mql5语言的特点、微妙之处以及技巧 - 页 160

 
Alexey Viktorov:

NULL是这样一个模糊的概念,你必须小心地处理它。

void OnStart()
{
  uchar Bytes[];

  Print(StringToCharArray(NULL, Bytes)); // 0
  Print(StringToCharArray("", Bytes));   // 1
}

再一次,输入的字符串不能是NULL(由 "").其他字符串可以。

 
fxsaber:

再一次,输入的字符串不能是NULL(由 "").其他字符串可以。

输入几乎与const同义,const必须被初始化
 
fxsaber:

再一次,输入的字符串不能是NULL(由 "").其他字符串可以。

再说一遍,为什么你认为不应该有这种转换?我的知识和经验不足以解释这一切。所以要坚持自己的观点。我希望开发商不要顺势而为,改变它。

 
Alexey Viktorov:

再说一遍,为什么你认为不应该有这种转换?

我很清楚为什么会发生这种转换。我们在这里谈论的是一个功能,而不是一个错误。

 
Maxim Kuznetsov:
输入几乎与const同义,const必须被初始化

NULL是初始化。这个例子特意显示了一个非输入字符串。

 
fxsaber:
在编译时生成一个警告是个好主意。

是的,这种行为可能只是 "傻瓜"。
显然,由于输入变量 必须被初始化,当变量已经在内存中占据了至少一个字节时,=NULL 被人为地等同于=""

在MQL5中的条目。

string str=NULL;
string str;

是绝对相同的。没有为该变量分配内存。总之,我没有发现任何差异。
例如,在java中,这种记录略有不同,尽管在这两种情况下也没有为变量分配内存。第一个变量(String str = null;)将被视为初始化,尽管没有为变量分配内存,而且变量可以被打印为空。在第二种情况下(String str;),当你试图打印该变量时,将产生一个未初始化变量的错误。
也就是说,MQL5在这方面的容忍度更高。
哪个更好,我甚至不知道。

 
Nikolai Semko:

显然,由于输入变量 必须被初始化,=NULL 被人为地等同于="", 而该变量已经在内存中占据了至少一个字节。

NULL不是一个初始化,是一个值。你可以在代码中间给任何非恒定字符串变量赋值NULL。而它将等于NULL。

输入不等于NULL,因为在启动时,会创建一个不可见的set-file。从这个文件中,变量值被 "解析 "为输入。无论如何,解析不能输出NULL,因此它在这里放置一个空字符串。

只有input-string有这种行为。对于const-string和其他的,当然是好的。
 
fxsaber:

NULL不是一个初始化,而是一个值。你可以在代码中间把任何非const字符串变量赋值为NULL。而它将等于NULL。

输入不等于NULL,因为在启动时,会创建一个不可见的set-file。从这个文件中,变量值被 "解析 "为输入。解析时根本不会输出NULL,因此会在这里放置一个空字符串。

嗯,这就是我的意思。我同意。
唯一的问题是,在变量声明 阶段给一个字符串分配一个NULL值是没有意义的。

string str1 = NULL;
string str2;
PRINT((str1==NULL));   // true
PRINT((str2==NULL));   // true

这样做只是为了将内存中已经初始化的变量归零,是有意义的。

 
Nikolai Semko:

嗯,这就是我要说的。我同意。
唯一的问题是,在变量声明 阶段给一个字符串分配一个NULL值是没有意义的。

只有这样做才有意义,才能使内存中的一个变量归零。

#define  DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

这里的NULL初始化是有意义的。

 
fxsaber:

NULL初始化在这里是有意义的。