ローカル変数って何?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yk

ローカル変数って何?

#1

投稿記事 by yk » 9年前

タイトルどおりの初心者質問で悪いのですがローカル変数とはなんでしょうか?
ローカル変数は関数内でしか参照できないというのは知っていますが参照というのはなんでしょうか?   

変数の値を他の関数で書き換えることができないということでしょうか?
それとも変数の名前を他の関数で登場させること自体ができないのでしょうか?
(例えばif文なんかでフラグ変数を書くこともできないのか)

教えてくださいお願いします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ローカル変数って何?

#2

投稿記事 by softya(ソフト屋) » 9年前

俗にいうローカル変数は生存寿命が関数内しか無い変数のことを言います。
定義された関数外に出ると、その変数は寿命を迎えて文字通り消滅します。
また、スコープ(見える範囲)が定義ブロック(例えば関数内や{}内など)内に限られるため書き換え・参照(値を使うこと)が範囲内でしか出来ません。

例を書くとこうなります。 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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Suikaba
記事: 194
登録日時: 9年前

Re: ローカル変数って何?

#3

投稿記事 by Suikaba » 9年前

コード:

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つの手ではないでしょうか。

間違ってたらすいません・・・

たかぎ
記事: 328
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: ローカル変数って何?

#4

投稿記事 by たかぎ » 9年前

C++では、非局所オブジェクト(non-local object)とうものが明確に定義されています。
簡単にいえば、関数の外で定義するオブジェクトのことです(ただし、クラスの非静的データメンバは含みません)。
生存期間がどうであるかは関係ありません。
つまり、関数の中でstatic指定子を付けて定義したオブジェクトは局所オブジェクト扱いになります。

box
記事: 1746
登録日時: 9年前

Re: ローカル変数って何?

#5

投稿記事 by box » 9年前

softya(ソフト屋) さんが書きました:

コード:

#include "stdlib.h"
#include "stdio.h"
なにゆえダブルクォーテーションを使っているのか、いささか疑問に感じるところであります。
何だかすっごく不自然な感じがするのは当方だけでしょうか…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ローカル変数って何?

#6

投稿記事 by softya(ソフト屋) » 9年前

box さんが書きました:
softya(ソフト屋) さんが書きました:

コード:

#include "stdlib.h"
#include "stdio.h"
なにゆえダブルクォーテーションを使っているのか、いささか疑問に感じるところであります。
何だかすっごく不自然な感じがするのは当方だけでしょうか…。
たんなる書き間違いです。失礼しました。
#include <stdlib.h>
#include <stdio.h>
が正しいです。

ところでboxさんは、なぜ<>と""を使い分けないといけないかご存知ですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2648
登録日時: 9年前
連絡を取る:

Re: ローカル変数って何?

#7

投稿記事 by ISLe » 9年前

スコープとライフタイムがごっちゃに語られることが多いですよね。

コード:

#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
登録日時: 9年前

Re: ローカル変数って何?

#8

投稿記事 by aquashooting » 9年前

softya(ソフト屋) さんが書きました: なにゆえダブルクォーテーションを使っているのか、いささか疑問に感じるところであります。
何だかすっごく不自然な感じがするのは当方だけでしょうか…。
ところでboxさんは、なぜ<>と""を使い分けないといけないかご存知ですか?
それについてはboxさんに代わり説明します。
例として最初におまじないのように#include<stdio.h>と書きますよね。
「<>」内でくくられているヘッダファイルは「コンパイラのおまけでついているヘッダファイル」のことなんです。

それに対し#include "booting.h"とくくってあるのは「自分で作ったヘッダファイル」
のことなのです。
だから間違って#include "stdio.h"と書いてしまうとエラーが出ることになります。(ここまで間違っていたら申し訳ありません)

#include "(任意のファイル名).h"の便利な点としては「分割」ができるという点です。
自分で作った関数や処理内容を一つのファイルにまとめて書こうとすると、容量が大きくなりコンパイルしづらくなります。
そこで、あらかじめ自分の好きな名前のヘッダファイルにその関数名を書き込んで読み込むようにすれば、コンパイルが早く、しかも容量を節約できるというメリットがあります。

しかし、デメリットとしてはファイル数が多くなるのと、わかりやすい名前にしておかないと
何がなんだかわからなくなるというのがデメリットですね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ローカル変数って何?

#9

投稿記事 by softya(ソフト屋) » 9年前

aquashooting さんが書きました:
softya(ソフト屋) さんが書きました: なにゆえダブルクォーテーションを使っているのか、いささか疑問に感じるところであります。
何だかすっごく不自然な感じがするのは当方だけでしょうか…。
ところでboxさんは、なぜ<>と""を使い分けないといけないかご存知ですか?
それについてはboxさんに代わり説明します。
例として最初におまじないのように#include<stdio.h>と書きますよね。
「<>」内でくくられているヘッダファイルは「コンパイラのおまけでついているヘッダファイル」のことなんです。

それに対し#include "booting.h"とくくってあるのは「自分で作ったヘッダファイル」
のことなのです。
だから間違って#include "stdio.h"と書いてしまうとエラーが出ることになります。(ここまで間違っていたら申し訳ありません)

#include "(任意のファイル名).h"の便利な点としては「分割」ができるという点です。
自分で作った関数や処理内容を一つのファイルにまとめて書こうとすると、容量が大きくなりコンパイルしづらくなります。
そこで、あらかじめ自分の好きな名前のヘッダファイルにその関数名を書き込んで読み込むようにすれば、コンパイルが早く、しかも容量を節約できるというメリットがあります。

しかし、デメリットとしてはファイル数が多くなるのと、わかりやすい名前にしておかないと
何がなんだかわからなくなるというのがデメリットですね。
微妙に不正解です。
>だから間違って#include "stdio.h"と書いてしまうとエラーが出ることになります。(ここまで間違っていたら申し訳ありません)
エラーは出ません。
ぜひ、試してみてください。

[追記]
なぜ、こんな事を書いたかと言うとなんとなく駄目だと聞いたから使っていないのなら、ぜひ理由を知ってもらいたかったからです。
調べることでより知識も深まりますので、ぜひ試して調べてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へろりくしょん
記事: 92
登録日時: 9年前
住所: 福岡

Re: ローカル変数って何?

#10

投稿記事 by へろりくしょん » 9年前

aquashooting さんが書きました:
softya(ソフト屋) さんが書きました: 例として最初におまじないのように#include<stdio.h>と書きますよね。
「<>」内でくくられているヘッダファイルは「コンパイラのおまけでついているヘッダファイル」のことなんです。

それに対し#include "booting.h"とくくってあるのは「自分で作ったヘッダファイル」
のことなのです。
だから間違って#include "stdio.h"と書いてしまうとエラーが出ることになります。(ここまで間違っていたら申し訳ありません)
使い分けとしては結果として、そのようになりますが、"" と <> の違いは、単純にパスの検索順番が違うだけです。 

アバター
aquashooting
記事: 67
登録日時: 9年前

Re: ローカル変数って何?

#11

投稿記事 by aquashooting » 9年前

>へろりんさん
なるほど、それは知りませんでした。
詳しく説明していただきありがとうございます

box
記事: 1746
登録日時: 9年前

Re: ローカル変数って何?

#12

投稿記事 by box » 9年前

softya(ソフト屋) さんが書きました: なぜ<>と""を使い分けないといけないかご存知ですか?
私はC言語の初心者なので、わかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
GRAM
記事: 164
登録日時: 9年前
住所: 大阪

Re: ローカル変数って何?

#13

投稿記事 by GRAM » 9年前

ちなみにVisualStudioの場合、自分で作ったヘッダファイルであっても""でくくるよりも<>でくくったほうが楽ちんな場合があります
というのもインテリセンス君は、プロジェクト外部のヘッダをインクルードしようとするとき<>でくくってないと探してくれないからです。
逆にプロジェクト内部のヘッダをインクルードしようとすると""のほうが楽ちんです。
まぁあくまでもVSを使うのならの話ですけど。

そして完全に話がそれてますねw

たかぎ
記事: 328
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: ローカル変数って何?

#14

投稿記事 by たかぎ » 9年前

#include指令の<>と""は、思っている以上に大きな違いがあります。
<>形式で取り込むのは「ヘッダ」であり、必ずしもファイルとは限りません。
""形式で取り込むのはソースファイルですが、該当するソースファイルが見つからなければ<>形式と同様にヘッダを検索します。
検索対象となる場所や順序はいずれも処理系定義になります。

コード:

#include "stdio.h"
とした場合、最初はstdio.hという名前のソースファイルを探しますが、見つからなければ標準ヘッダのstdio.hを取り込みます。
ですので、上記はエラーにはなりません。
(自分で書いたソースファイルstdio.hの内容にエラーがある場合は話が別です)

box
記事: 1746
登録日時: 9年前

Re: ローカル変数って何?

#15

投稿記事 by box » 9年前

なんかあたしの投稿あたりがきっかけで、トピックのタイトルとは全く違う方向へ
話が進んでいるみたいですね。

ここらあたりで、ぐい~っと軌道修正しません?または話を終わらせるか…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る