みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C++のコードの書き方

プログラミング勉強中のものです
疑問に思ったところがあるので教えてください

入門サイトなどで勉強したところによると
main関数の中で変数や配列の宣言をしていたのですが
他人のコードを見るとmain関数の外で宣言してる人を多く見かけますが
外に書くのが主流なのでしょうか?
またその利点はなんでしょうか?

よろしくおねがいします

投稿日時 - 2019-01-25 07:51:13

QNo.9581163

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

詳しい解説は既出の回答と下記を参照してください。
https://9cguide.appspot.com/20-02.html
要はその関数内だけで使用するか、他の関数でも共用するか(ファイルを分けた場合も含む)の違いです。
どっちが便利、というよりプログラムの構造上、共用のエリアが不可欠かどうか、ということでしょう。
基本的にC言語は、関数(引数を与えて、結果を出力させる)で記述するものなので、無用に共用の変数を使うべきではないと思います。

プログラムを設計するに辺り、プログラムのすべてで共通に使用する必要がある変数エリアと、そうではないエリアを明確に分けた上で、記述してみてください。そういう例題があるとよいですがパッと思い浮かばないので、先のリンクの例題集など参考にしてみてください。
変数の配置(メモリの配置)って、プログラムの設計の結構重要な要素です。
ご参考に。

投稿日時 - 2019-01-25 13:02:10

ANo.4

>外に書くのが主流なのでしょうか?
どちらともいえません
>またその利点はなんでしょうか?
外に書いて共用すれば他で同じことを書かなくてよい

投稿日時 - 2019-01-25 11:37:33

ファイルAで、「配列を宣言」
ファイルBと、ファイルCが「ファイルAで宣言した配列を使う」
とした場合、BとCにその配列を入れても確かに動きますが、
メンテナンスの時、BとC同時にメンテナンスが必要になってしまいますね。
まして、これが大規模で、その配列を
100人が参照していたら?と考えると、
mainではなく、外に置くべきと考えるべきですね!
それと、実体の場所

abc=50; // これは起動時にすでに実体化している。
main() {
abc=50; // こちらはmainの中にいるときだけ実体化している
}
の違いもありますよ。これは即値ですが、
大きなサイズの配列変数だったら、各変数に入るたびに
実体を作ってしまうので、オーバーヘッドが生まれますからね。

ただ、質問者さんの場合は今はmainなので、
子関数を作り出すとこの意味が恐らく勝手にわかると思うので、
あまり深く考えなくても今は大丈夫かもしれないと
感じましたね。

前回の質問も見てますが、なんとなく覚えるの早そうな
質問者さんに感じてるので、ちょっと楽しみです!。

投稿日時 - 2019-01-25 09:59:15

グローバルエリアに変数を宣言すると、メモリーダンプを見る時に場所が探しやすいというのがあるわ。
関数の内部に宣言すると、スタックかヒープ領域に確保されるので、関数を抜ければ消えてしまう。
異常終了時にもどうしても値を確認しておきたい変数があるときはグローバル領域に確保しますな。

投稿日時 - 2019-01-25 09:06:41

ANo.1

それはその変数がどこまで見えていいか(変数のスコープ)によります。
main関数の、という風に断っているということは、質問者さんは
main関数だけからなるコードを書かれているということなのでしょうか。
だとすれば、まずは機能ごとに適切に関数を分けて、
各関数で使う変数は他から見えない(変数の受け渡しは引数で行なう)
ように設計してみてはどうでしょう。

各関数で使う変数が他から見えないことの利点は、
その変数の値を他から不用意に書き換えられることがないということです。
関数の外で定義した変数は、どの関数からも見えますので、
コードのバグか何かでいつの間にか内容が書き換わっているという
発見しづらいバグにつながるおそれがあると思います。

投稿日時 - 2019-01-25 09:02:42

あなたにオススメの質問