Ошибки, баги, вопросы - страница 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 нет

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

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