ページ 1 / 1
ローカル変数って何?
Posted: 2011年5月10日(火) 18:52
by yk
タイトルどおりの初心者質問で悪いのですがローカル変数とはなんでしょうか?
ローカル変数は関数内でしか参照できないというのは知っていますが参照というのはなんでしょうか?
変数の値を他の関数で書き換えることができないということでしょうか?
それとも変数の名前を他の関数で登場させること自体ができないのでしょうか?
(例えばif文なんかでフラグ変数を書くこともできないのか)
教えてくださいお願いします
Re: ローカル変数って何?
Posted: 2011年5月10日(火) 19:28
by softya(ソフト屋)
俗にいうローカル変数は生存寿命が関数内しか無い変数のことを言います。
定義された関数外に出ると、その変数は寿命を迎えて文字通り消滅します。
また、スコープ(見える範囲)が定義ブロック(例えば関数内や{}内など)内に限られるため書き換え・参照(値を使うこと)が範囲内でしか出来ません。
例を書くとこうなります。 sub1のaとsub2のaは同じ名前ですが別の変数です。
こういうプログラムを組んで色々試してみてください。
コード:
#include "stdlib.h"
#include "stdio.h"
void sub2(void)
{
int a;
a=2;
printf( "sub2 a=%d\n",a);
}
void sub1(void)
{
int a;
a=1;
sub2();
printf( "sub1 a=%d\n",a);
}
int main(void)
{
sub1();
return 0;
}
Re: ローカル変数って何?
Posted: 2011年5月10日(火) 19:31
by Suikaba
コード:
void print()
{
int a = 4; // ローカル変数
printf("%d", a);
} // ここで a は破棄される
int main()
{
print();
return 0;
}
ここで言うint aというのは、print()内で宣言されていますので、
printという関数を抜けると破棄されて存在しなくなります。
関数内であれば、フラグを使おうがなにをしようが勝手です。
もし、そこで得たものを保存しておきたい場合は、
コード:
int b = 0; // 保存用のグローバル変数
void print()
{
int a = 4; // ローカル変数
b = a;
printf("%d", a);
} // ここで a は破棄される
int main()
{
print();
printf( "%d", b );
return 0;
}
とすれば使えます。フラグ変数も同様です。
ただ、グローバル変数はあまりお勧めできないので、乱用はしないように・・・
classのメンバとして持っておく、というのも1つの手ではないでしょうか。
間違ってたらすいません・・・
Re: ローカル変数って何?
Posted: 2011年5月10日(火) 20:23
by たかぎ
C++では、非局所オブジェクト(non-local object)とうものが明確に定義されています。
簡単にいえば、関数の外で定義するオブジェクトのことです(ただし、クラスの非静的データメンバは含みません)。
生存期間がどうであるかは関係ありません。
つまり、関数の中でstatic指定子を付けて定義したオブジェクトは局所オブジェクト扱いになります。
Re: ローカル変数って何?
Posted: 2011年5月10日(火) 22:01
by box
softya(ソフト屋) さんが書きました:
コード:
#include "stdlib.h"
#include "stdio.h"
なにゆえダブルクォーテーションを使っているのか、いささか疑問に感じるところであります。
何だかすっごく不自然な感じがするのは当方だけでしょうか…。
Re: ローカル変数って何?
Posted: 2011年5月10日(火) 22:08
by softya(ソフト屋)
box さんが書きました:softya(ソフト屋) さんが書きました:
コード:
#include "stdlib.h"
#include "stdio.h"
なにゆえダブルクォーテーションを使っているのか、いささか疑問に感じるところであります。
何だかすっごく不自然な感じがするのは当方だけでしょうか…。
たんなる書き間違いです。失礼しました。
#include <stdlib.h>
#include <stdio.h>
が正しいです。
ところでboxさんは、なぜ<>と""を使い分けないといけないかご存知ですか?
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 02:45
by ISLe
スコープとライフタイムがごっちゃに語られることが多いですよね。
コード:
#include <stdio.h>
void foo(int *p){
*p *= 10;
}
int main(void)
{
int a = 1;
printf("a=%d\n", a);
{
int b = 2;
printf("b=%d\n", b);
foo(&b);
printf("b=%d\n", b);
}
foo(&a);
printf("a=%d\n", a);
return 0;
}
宣言された名前を使ってアクセスできるかどうかがスコープで、ソースファイル記述上の宣言されたところから宣言のあるブロックが終わるところまでの範囲。
宣言された変数の値にアクセスできるかどうかがライフタイムで、宣言されたところから宣言のあるブロックが終わるところまで実行しているあいだの期間(静的変数は別)。
スコープが関数内に限定されるのがローカル変数ってことになりますかね。
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 16:51
by aquashooting
softya(ソフト屋) さんが書きました:
なにゆえダブルクォーテーションを使っているのか、いささか疑問に感じるところであります。
何だかすっごく不自然な感じがするのは当方だけでしょうか…。
ところでboxさんは、なぜ<>と""を使い分けないといけないかご存知ですか?
それについてはboxさんに代わり説明します。
例として最初におまじないのように#include<stdio.h>と書きますよね。
「<>」内でくくられているヘッダファイルは「コンパイラのおまけでついているヘッダファイル」のことなんです。
それに対し#include "booting.h"とくくってあるのは「自分で作ったヘッダファイル」
のことなのです。
だから間違って#include "stdio.h"と書いてしまうとエラーが出ることになります。(ここまで間違っていたら申し訳ありません)
#include "(任意のファイル名).h"の便利な点としては「分割」ができるという点です。
自分で作った関数や処理内容を一つのファイルにまとめて書こうとすると、容量が大きくなりコンパイルしづらくなります。
そこで、あらかじめ自分の好きな名前のヘッダファイルにその関数名を書き込んで読み込むようにすれば、コンパイルが早く、しかも容量を節約できるというメリットがあります。
しかし、デメリットとしてはファイル数が多くなるのと、わかりやすい名前にしておかないと
何がなんだかわからなくなるというのがデメリットですね。
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 17:02
by softya(ソフト屋)
aquashooting さんが書きました:softya(ソフト屋) さんが書きました:
なにゆえダブルクォーテーションを使っているのか、いささか疑問に感じるところであります。
何だかすっごく不自然な感じがするのは当方だけでしょうか…。
ところでboxさんは、なぜ<>と""を使い分けないといけないかご存知ですか?
それについてはboxさんに代わり説明します。
例として最初におまじないのように#include<stdio.h>と書きますよね。
「<>」内でくくられているヘッダファイルは「コンパイラのおまけでついているヘッダファイル」のことなんです。
それに対し#include "booting.h"とくくってあるのは「自分で作ったヘッダファイル」
のことなのです。
だから間違って#include "stdio.h"と書いてしまうとエラーが出ることになります。(ここまで間違っていたら申し訳ありません)
#include "(任意のファイル名).h"の便利な点としては「分割」ができるという点です。
自分で作った関数や処理内容を一つのファイルにまとめて書こうとすると、容量が大きくなりコンパイルしづらくなります。
そこで、あらかじめ自分の好きな名前のヘッダファイルにその関数名を書き込んで読み込むようにすれば、コンパイルが早く、しかも容量を節約できるというメリットがあります。
しかし、デメリットとしてはファイル数が多くなるのと、わかりやすい名前にしておかないと
何がなんだかわからなくなるというのがデメリットですね。
微妙に不正解です。
>だから間違って#include "stdio.h"と書いてしまうとエラーが出ることになります。(ここまで間違っていたら申し訳ありません)
エラーは出ません。
ぜひ、試してみてください。
[追記]
なぜ、こんな事を書いたかと言うとなんとなく駄目だと聞いたから使っていないのなら、ぜひ理由を知ってもらいたかったからです。
調べることでより知識も深まりますので、ぜひ試して調べてみてください。
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 17:06
by へろりくしょん
aquashooting さんが書きました:softya(ソフト屋) さんが書きました:
例として最初におまじないのように#include<stdio.h>と書きますよね。
「<>」内でくくられているヘッダファイルは「コンパイラのおまけでついているヘッダファイル」のことなんです。
それに対し#include "booting.h"とくくってあるのは「自分で作ったヘッダファイル」
のことなのです。
だから間違って#include "stdio.h"と書いてしまうとエラーが出ることになります。(ここまで間違っていたら申し訳ありません)
使い分けとしては結果として、そのようになりますが、"" と <> の違いは、単純にパスの検索順番が違うだけです。
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 20:04
by aquashooting
>へろりんさん
なるほど、それは知りませんでした。
詳しく説明していただきありがとうございます
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 22:13
by box
softya(ソフト屋) さんが書きました:
なぜ<>と""を使い分けないといけないかご存知ですか?
私はC言語の初心者なので、わかりません。
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 22:26
by GRAM
ちなみにVisualStudioの場合、自分で作ったヘッダファイルであっても""でくくるよりも<>でくくったほうが楽ちんな場合があります
というのもインテリセンス君は、プロジェクト外部のヘッダをインクルードしようとするとき<>でくくってないと探してくれないからです。
逆にプロジェクト内部のヘッダをインクルードしようとすると""のほうが楽ちんです。
まぁあくまでもVSを使うのならの話ですけど。
そして完全に話がそれてますねw
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 22:59
by たかぎ
#include指令の<>と""は、思っている以上に大きな違いがあります。
<>形式で取り込むのは「ヘッダ」であり、必ずしもファイルとは限りません。
""形式で取り込むのはソースファイルですが、該当するソースファイルが見つからなければ<>形式と同様にヘッダを検索します。
検索対象となる場所や順序はいずれも処理系定義になります。
とした場合、最初はstdio.hという名前のソースファイルを探しますが、見つからなければ標準ヘッダのstdio.hを取り込みます。
ですので、上記はエラーにはなりません。
(自分で書いたソースファイルstdio.hの内容にエラーがある場合は話が別です)
Re: ローカル変数って何?
Posted: 2011年5月11日(水) 23:22
by box
なんかあたしの投稿あたりがきっかけで、トピックのタイトルとは全く違う方向へ
話が進んでいるみたいですね。
ここらあたりで、ぐい~っと軌道修正しません?または話を終わらせるか…。