下の二つのプログラムは、変数iを宣言している場所が違いますがどちらのほうが良いのですか?
c
1for(int i=0; i<max; ++i){}
c
1int i; 2 3for(i=0; i<max; ++i){}
スコープはなるべく小さくするという設計思想がありますが、それに基づくと上のプログラムのほうがいい気がします。
あと、変数がメモリに領域を確保する時間をプログラマは考慮すべきなのですか?一瞬なので考慮しなくてもいいのですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
for文内でint iを宣言した場合、そのiの値をfor文の外で使えません。
c
1for(int i=0; i<max; ++i){ 2 if (condition(i) > 0 { 3 break; 4 } 5} 6 7/* iの値はわからない */ 8
例えば、breakなどでfor文から抜けだしたときに、どこまで処理したいかを知る方法はありません。
その場合、for文の外でint iを宣言しておきます。
c
1int i; 2 3for(i=0; i<max; ++i){ 4 if (condition(i) > 0 { 5 break; 6 } 7} 8 9/* iの値はわかる */
また、for文の外でint iを宣言した場合、このプログラムを読む人はiの値をどこかで使うだろうと予測してプログラムを読みます。そういう意味でもスコープはなるべく小さくする方がいいです。
投稿2018/12/09 14:25
総合スコア1088
0
最初のコードでは、forループの中だけが有効範囲となります
あと、変数がメモリに領域を確保する時間をプログラマは考慮すべきなのですか?
考慮する必要はありません。
ローカル変数はどこで宣言しようと、関数が始まるときに確保され、終了するときに開放されます
投稿2018/12/09 14:19
総合スコア87774
0
誰も触れてなかったので
できるならfor(int i = 0;
の方がいいです。
大昔のC言語(C89)はコレができないので関数冒頭でint i;
としているコードがあるわけです。
なお、大昔の事を気にしてる筈なのに行コメント//
を使ってるコードはよくわからないです。
投稿2018/12/09 23:15
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/10 11:54
2018/12/10 14:15
0
... どちらのほうが良いのですか? ...
for(int i=0; i<max; ++i)のほうが良いです。
スコープが狭くなるからです。
... 変数がメモリに領域を確保する時間 ...
ローカル変数は スタック領域を使います。 スタック領域は、malloc などでメモリ領域確保されるわけではありません。
コンパイラが、iは スタック領域のどこ(offset)使うか決定してくれるだけです。
for の外、中のどちらで i を宣言しても速度に差は出ないはずです。
実際に確認はしていませんが、次の3つはどれも同じようコンパイルされると思います。
int i, j; for (i = 0; ...) {} for (j = 0; ...) {}
for (int i = 0; ...) {} for (int j = 0; ...) {}
for (int i = 0; ...) {} for (int i = 0; ...) {}
興味があれば、 どんなふうにコンパイルされるかを実際に確認してみることをおすすめします。
参考情報
- C言語のコードをアセンブラ出力を確認しながら最適化する
投稿2018/12/09 14:54
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/10 11:48
2018/12/10 12:56
0
あと、変数がメモリに領域を確保する時間をプログラマは考慮すべきなのですか?一瞬なので考慮しなくてもいいのですか?
C言語の場合は、ローカル変数を宣言しても、それはコンパイラに対する指示でしかなくて、(実用的な処理系の場合)コンパイルしてしまえば「メモリのこの位置」あるいは「このレジスタ」という形で、変数の保存されている機械的な位置を直接参照するようなコードが出来上がるだけですので、「変数を宣言するたびにメモリ確保が起きる」ことはありません(ローカル変数用のメモリ領域は「スタック」としてもとから確保されています)。
C++の場合、int
など普通の型はC言語と事情が同じですが、クラスなどコンストラクタ・デストラクタがある型の変数を作った場合は、スコープインするとコンストラクタが動いて、スコープアウトするとデストラクタが動きますので、その動作分の負荷はかかります。
投稿2018/12/09 14:32
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/09 14:52