错误、漏洞、问题 - 页 2890

 
Roman:

如果你需要捕捉这个值的错误,好用333初始化它 ))
这只是一个起始值。

这是正确的,这是一个错误。因此,要么我们在所有情况下对分配未初始化的变量发出警告,要么我们不这样做,而是在所有相同的情况下,在语言中用默认的零来初始化它。

 
Valeriy Yastremskiy:

这是正确的,这是一个错误。事实证明,要么我们在所有情况下对分配未启动 的变量给予警告,要么就不给予警告,而是在所有相同的情况下,在语言内用默认的零来启动它。

只是在上述例子中,你在哪里看到了这样的情况?

 
A100:

只是在上述例子中,你在哪里看到了这样的情况?

关于交易、自动交易系统和策略测试的论坛

虫子,虫子,问题

A100, 2020.10.27 16:11

你必须初始化它,但只能用一个有意义的值。在上面的例子中没有这样的值,所以做法还不错,是唯一可能的做法。否则就会出现双重初始化

int f( int i ) { /*вычисления*/ }
void g( int k )
{
        for ( int i = 0, j; i < k; i = j )
        {
                j = f( i );
                /*вычисления*/
        }
}

 
Roman:

那么未初始化的变量的赋值 在哪里呢?哪个变量是未初始化的?它被分配给谁?你强调的是:j从=到左边的j=,而不是到右边的=j,也就是说,在它本身被赋值 之前,它没有被赋给任何人

 
A100:

只是在上述例子中,你在哪里看到了这样的情况?

是的,我忘了,在所有情况下,未初始化的变量都有一个赋值,而不是反过来。也许编译器是自上而下的排查,在这种情况下,是的,赋值在底部,反之在顶部。还有一个关于可能向非初始化的变量赋值的警告。

 
A100:

那么未初始化的变量的赋值 在哪里呢?哪个变量未被初始化? 它被分配给了谁?你所强调的是j=,而不是=j

循环体 中向一个未初始化的变量赋值。在第一次迭代之前,j还没有被初始化。
,在第一次迭代通过后,它将被初始化。
循环主体首先被执行,然后是增量范围。你已经用i = j代替了它

 
Roman:

赋值给一个未初始化的变量,在函数体内。在第一次迭代之前,j还没有被初始化。
,它将在第一次迭代之后被初始化。
首先执行的是函数主体,然后是增量区。你已经用i = j代替了它

不,这是正确的,在第一次迭代时不推断j,启动时只是j=f(i),在第二次迭代时只会是i=j,我想编译器是从上到下解析的,并给出警告。

 
Valeriy Yastremskiy:

不,是这样的,变量j在第一次迭代时没有被初始化,只是j=f(i),在第二次迭代时只有i=j,我想编译器从上到下进行解析,并给出警告。

是的,但是在第一次迭代之前,j变量还没有被初始化,这就是编译器在发誓的内容。

 
Valeriy Yastremskiy:

是的,这是错的,在所有未初始化变量的情况下,都有一个赋值,而不是相反。也许编译器是自上而下的,所以是的,赋值是在底部,反之是在顶部。还有一个关于可能 向非初始化的变量赋值的警告。

这可能是在编译器没有客观信息的情况下。

void f( int& i ) { /*вычисления*/ }
void OnStart()
{
        int i;
        f( i );
        int j = i; //нормально ??? а если i не инициализирована?
        printf("%d",j);
}

也就是说,也许f()正在初始化i,也许没有。在这里,C++编译器给出了一个警告,而MQL编译器不知为何没有。

 
A100:

这可能是在编译器客观上没有信息的时候。

也就是说,也许f()有i初始化,也许没有。而这里C++编译器给出了一个警告,MQL则没有。

我不知道他们说什么,我认为是一个更简单的编译器。从上到下解析布局语法,找出明显的语法错误,不尊重类型和使用错误的变量。在第二个例子中,当初始化被放下的时候,并没有产生一个警告。尽管程序的执行是相同的。