错误、漏洞、问题 - 页 2889

 
A100:

你有一个随机数字0,我有540016640

但它们仍然是随机数字。

我以为MQ已经被清零了。

 
Roman:

我以为MQ已经被清零了。

全局变量 中,它们似乎被初始化为零,但在函数的主体中,我在第一遍就遇到了不同的初始化。我试图在使用前总是进行初始化。虽然我同意,但行为必须是毫不含糊的。

循环体中的另一个声明,在括号中,使变量成为循环的局部变量。只是文档中没有。

 
Roman:

而且,编译器也不会警告 说该变量没有被初始化。

Print(...)可能不会警告你,因为参数是 通过非常量引用传递的

int f( int& i ) { return i; }
void OnStart()
{
        int i;  
        f( i ); //нормально
}
 
A100:

如果循环是相同的,那么编译器的行为应该是相同的,而它是不同的。这就是错误所在。你解释了为什么在案例(1)中有警告,然后解释为什么在案例(2)中没有?原则上有什么变化?然后,如果使用了一个未初始化的变量,为什么执行代码时最后的结果是正确的?

这样一种科学--逻辑。如果A和B是一样的,而且A是红色的,B也一定是红色的,而不是绿色

我没有研究过编程,我只能从逻辑上推测,就像瓦西里-伊万诺维奇和佩特卡对逻辑的推测。

在第一种情况下,整个字符串被执行

for ( int i = 0, j; i < 10; i = j )

这里j变量没有被初始化,但它的值被分配给i变量。

在第二种情况下,尽管j变量没有被初始化,但在使用它的下一行中,并没有分配它的值,而是分配了它的值。换句话说,j变量被初始化为i变量的值

这里也有一个没有警告的变体

  for(int i = 0, j; i < 10; j = i)
   {
    j = i+1;
   }
 
Alexey Viktorov:

没有学习 成为一个程序员,我只能从逻辑上推测,就像瓦西里-伊万诺维奇和佩特卡推测逻辑一样。

在第一种情况下,整个字符串被执行

这里j变量没有被初始化,但它的值被分配给i变量。

又是谁在研究它?我认为这里的大多数人(像我一样)都是自学成才。

你需要研究for 循环操作符,以了解操作的顺序。在(1)中 j变量被赋予i+1的值

j = i+1

之前,它出现在赋值运算符的右边。

i = j
 
Valeriy Yastremskiy:

全局变量 似乎被初始化为0,但函数的主体在第一遍时遇到了不同的初始化。
我总是尝试在使用前进行初始化。虽然我同意,行为应该是毫不含糊的。

循环主体中的另一个声明,在括号中,使变量成为循环的局部变量。医生们就是没有这个能力。

是的,我也总是初始化变量,这就像二乘二,我应该永远记住
这是我从C语言中得到的))
所以这个带有未初始化变量的循环例子是不好的做法。

 
Roman:

是的,我也总是初始化变量,这就像二乘二,必须永远记住
这是我从C语言中得到的))
所以这个带有未初始化变量的循环例子是不好的做法。

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

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

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

如果你初始化了以下内容,会有什么变化?

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

如果初始化为j=333,会有什么变化?

为什么是零而不是j=333呢?也就是说,这是一个无意义的初始化,可以隐藏一个难以发现的错误

 
A100:

为什么是零而不是333呢?也就是说,这是一个无意义的初始化,可以隐藏一个难以捕捉的错误。

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