エラー、バグ、質問 - ページ 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 変数に代入されています.

2つ目のケースでは、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:

グローバル 変数はゼロで初期化されているようですが、関数本体は最初のパスで異なる初期化に遭遇しています。
私はいつも使用前に初期化するようにしています。そうではあるが、行動は曖昧であってはならない。

そして、ループ本体の括弧の中にある別の宣言が、その変数をループのローカル変数にする。ドコモは持っていないだけ。

そうですね、私も必ず変数を初期化します、二度手間みたいで、いつも忘れないようにしないと いけませんね。
Got it into my head from C language ))
つまり、この例のように初期化されていない変数を使ったループは悪しき習慣なのです。

 
Roman:

そうですね、私も必ず変数を初期化します。2×2のようなもので、常に覚えておかなければ なりませんね。
Got it into my head from C language ))
つまり、この例のように初期化されていない変数を使ったループは悪しき習慣なのです。

初期化が必要ですが、意味のある値であれば大丈夫です。上記の例ではそのような値はないので、悪いやり方ではなく、唯一可能な方法です。そうでなければ、二重の初期化が発生します

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ではなく0なのでしょうか?つまり、見つけにくいエラーを隠すための無意味な初期化です

 
A100:

なぜ333ではなくゼロなのか、というと。つまり、意味のない初期化であるため、捕捉しにくいエラーが隠されている可能性があります。

この値のエラーをキャッチする必要がある場合は、まあ、333で初期化してください ))
ただの開始値です。