Ошибки, баги, вопросы - страница 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 одинаковые и А красного цвета, то В тоже должно быть красным, а не зеленым

Я не учился на программиста, могу только логически порассуждать как Василий Иваныч с Петькой рассуждал о логике.

В первом случае выполняется вся строка

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:

С глобальными переменными вроде иницилизируются нулем, а вот в теле функций встречался на первом проходе разные инициализации.
Стараюсь перед пользованием всегда инициализировать. Хотя согласен, поведение должно быть однозначным.

И еще объявление в теле цикла, в круглых скобках делает переменную локальной по отношению к циклу. принимаю как есть. В доках этого просто нет.

Да, я тоже всегда инициализирую переменные, это как дважды два, должен помнить всегда.
Вбили в голову из языка Си ))
По этому данный пример цикла с неинициализированной переменной, плохая практика. 

 
Roman:

Да, я тоже всегда инициализирую переменные, это как дважды два, должен помнить всегда.
Вбили в голову из языка Си ))
По этому данный пример цикла с неинициализированной переменной, плохая практика. 

Инициализировать нужно, но только осмысленным значением. В указанном примере такого значения нет, поэтому практика не плохая, единственно возможная. В противном случае была бы двойная инициализация

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 допустим? Т.е. это бессмысленная инициализация, которая может скрыть трудноуловимую ошибку

 
A100:

А почему нулем, а не 333 допустим? Т.е. это бессмысленная инициализация, которая может скрыть трудноуловимую ошибку

Ели вам нужно отловить ошибку этого значения, ну и проинициализируйте её 333 ))
Это же только стартовое значение.

Причина обращения: