dポイントプレゼントキャンペーン実施中!

C++についての質問です。プログラミング初心者ですが、よろしくお願いします。
最近、関数の外側でも変数を宣言できることを知りました。関数の外側で変数を宣言すると、全ての関数でその変数にアクセスすることができ大変便利なように思います。
「わざわざポインタ渡しなどする必要はないのでは?」と思ってしまいました。
これは何か問題があるのでしょうか?

初心者の言葉で説明しても理解しにくいかと思いますので、例として「足し算するプログラム」を以下に記載します。
ポインタ渡しで書くと、以下のような感じになるかと思います。

//●ポインタ渡し
#include "stdafx.h"
#include <iostream>
void func(int x,int y,int *pans){
*pans = x+y;
}
void main(){
int a=10, b=20, ans;
func(a,b,&ans);
std::cout << ans << std::endl;
}

しかし、mainの外に変数を宣言すれば

//●mainの外に変数
#include "stdafx.h"
#include <iostream>
int a,b,ans;
void func(int x,int y){
ans = x+y;
}
void main(){
a=10;
b=20;
func(a,b);
std::cout << ans << std::endl;
}

ansをポインタ渡しする必要なく、funcの計算結果をansに代入できました。
「●mainの外に変数」のプログラムはどのような問題や危険性を孕んでいるのでしょうか?

以上になります。長文お読みいただきありがとうございました。
よろしくお願いいたします。

A 回答 (2件)

例えば、


機能を追加して
int func0(int x,int y,int z){
ans = x - y ;
return ans -z;
}
を作ります。

void main(){
a=10;
b=20;
func(a,b);
std::cout << ans << std::endl;

int c=func0(30,40,50) ;
std::cout << c << std::endl;
std::cout << ans+c << std::endl;
}

とすると、
std::cout << ans << std::endl;
→ 30
std::cout << c << std::endl;
→ -60
と出力されます。

ということは
std::cout << ans+c << std::endl;
で期待するのは、
ans 30 + c -60 = -30
となりますが、実際には「-70」が出力されます。

これは、func0で途中計算に ans = x - y ; としてしまったため、ansが変わってしまったからです。


この程度の規模なら、管理もできるでしょう。

ですが、例えば、 「std::cout は実はグローバル変数ansを書き換える」なんてことになっていたらどうでしょうか?
標準ライブラリでは、そのようなことが無いように作られていますが、自作プログラムだと、ついうっかりやってしまう可能性があります。
実用的なプログラムとなると、数千~数十万といった行数になってきます。その中から、グローバル変数がどこで使われているか調べるのは並大抵のことではありません。


変数の有効範囲はなるべく狭く。必要なところだけで有効なようにする。
というのが、現在の主流の考えです。
    • good
    • 0
この回答へのお礼

詳細かつ例題まで載せてくださり、ありがとうございます。
これは「グローバル変数」と言うのですね。確かに期待される結果と違うものが出力されました。そして、この程度の行数でも変数がどこでどう変化したか追うのに苦労してしまいました。
『変数の有効範囲はなるべく狭く。必要なところだけで有効なようにする。』
これは肝に銘ずることにします。
ご回答ありがとうございました。ベストアンサーとさせていただきます。

お礼日時:2013/10/04 15:03

「全ての関数でその変数にアクセスすることができ」るのが, まさに利点であると同時に問題点です. 「いつの間にか値を変えることができる」ってことだから.



ところで, 外部変数とした後者のプログラムで, なぜ func に a や b を引数として渡しているのですか?
    • good
    • 0
この回答へのお礼

簡潔かつお早いご回答下さりありがとうございます。
大きな規模のプログラムになると問題が起こってくるのでしょうね。今後このような書き方をしないよう注意しようと思います。ありがとうございました。
ちなみに、質問に記載したプログラムは、この質問のために書いたもので特に意味のあるものではありません。初心者の思いつきゆえ、理解しがたいところがあったかと思いますがご容赦ください…

お礼日時:2013/10/04 14:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!