2017-02-21 3 views
2

私は最近、いくつかのコードを見直していましたが、私が混乱していたことを知りました。私はこのように実現される機能、int getNewNumber(int num, int dir)を、持っていると言う:その変数を引数として取る関数で変数を初期化する

int getNewNumber(int num, int dir) { 
    int newNum = num; 
    if(dir == 1) { 
     newNum++; 
    } else { 
     newNum--; 
    } 
    return newNum; 
} 

関数を呼び出すときに今、私はこのようなものがあります:

int number = getNewNumber(number, 1); 

はそれがnewNumに渡される前に0に初期化されましたか?変数を初期化する際に変数をどのように使用するかについては混乱しています。

+1

外部スコープに同じ名前の別の変数がありますか? –

+0

そのコードはC++コードとしてコンパイルすべきではありません。関数には戻り値の型が必要です。 –

+2

少なくとも未特定の動作である未初期化変数を読み込んでいます。 – nwp

答えて

3

newNumに渡される前に0に初期化されていますか?

多分。文脈によって異なります。変数がグローバルスタティックである場合、動的初期化の前にゼロ初期化されます。

自動変数の場合、getNewNumberに渡される値は不定であり、その値を使用すると未定義の動作が発生します。まともなコンパイラが警告します。

変数を初期化時に引数として使用する方法については混乱しています。

変数が静的に初期化されていない場合は、動作を定義した方法で独自の初期化でその値を使用することはできません。

ダイナミック初期化の前に変数がゼロに初期化されていれば、その値を使用できますが、リテラルゼロを使用することもできます。これはプログラムの読者にとっては明らかです。私は、独自の初期化で変数の値を使用する便利な方法はないと思います。

0

私は本当にそれがコンパイラに依存していると思います。一般的に私はそれを安全ではないと呼んでいます。最良の場合、同じ型を持つ値を取得するか、この型に変換できます。最悪の場合、プログラムは単にクラッシュします。