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