変数宣言・変数定義のちがいって??
同じ意味なんでしょうか?

私の解釈では、
・宣言っていうのは、今からこの変数を使いますよってことで。
・定義っていうのは、実際に変数の領域をわりあてるってイメージなんですけど・・

なので、
int a; ←これは変数定義
extern int a; ←これは変数(extern)宣言

あってるでしょうか?

A 回答 (4件)

JIS X3010:2003では、6.7 宣言において、



意味規則 宣言は, 幾つかの識別子の解釈及び属性を指定する。識別子の定義(definition)とは, 宣言のうち次のものをいう。
- オブジェクトに対しては, そのオブジェクトの記憶域を確保する宣言
- 関数に対しては, 関数本体を含む宣言
- 列挙定数又は型定義名に対しては, その識別子の(唯一の)宣言

と規定されています。

> int a; ←これは変数定義
> extern int a; ←これは変数(extern)宣言

後者はあっています。
前者は文脈によって解釈が変わります。
ファイル有効範囲に前者の記述が現れた場合、それは「仮定義」になります。同じファイル有効範囲に、初期化子または記憶クラス指定子を伴う宣言が現れると、そちらが本当な定義になります。
    • good
    • 0

a function declaration with no function body.



declare されたものはどこかで詳細に define されて居なければならない。
というかんじだから良いとおもいますよ。
    • good
    • 0

>・宣言っていうのは、今からこの変数を使いますよってことで。


>・定義っていうのは、実際に変数の領域をわりあてるってイメージなんですけど・

そのとおりです。
変数の定義は、当該変数の領域を確保する、という意味です。
変数の宣言は、どこか別の場所で定義した変数をそこで使う、という意味です。
したがいまして、宣言の中に定義を含むという#1さんの見解は逆です。
定義の中に宣言を含みます。
    • good
    • 0

c言語には、変数の型を定義する方法として、typedef と言うのが用意されていますよ。



c言語では、
・変数の宣言
と言うと、例えば今から a と言う変数を使いますよ。
と指示します。

・変数の定義
と言うと、変数がどんなものであるのかと言う事を指示する
ものだと思われます。

ですから、変数の宣言は、変数の型も指定していると思われますから、
変数の定義も含まれていると思われます。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字列型の一般的な変数名は?

おはようございます。

サンプルコードで
数値型の変数名は
Dim i As Long
のようにiをよく見かけます。

ただ、私が勉強不足のため
文字列型の変数名の一般的な文字に何が使われているのかわかりません。
(str?moji?など?)

サンプルコードを書くときに使用する
文字列型の変数名を教えてください!

Aベストアンサー

こんにちは。私の場合は自己流ですが、ネットなど見て他の方を
参考にして今日に至っています。

ルールは簡単で変数に何を(何の型)格納するかによって変えています。
・長整数の数字を格納する場合:Dim lngXXX as Long
・文字列を格納する場合:Dim strXXX as String
・ワークシートを格納する場合:Dim Wsh as WorkSheet

などです。「変数の型」を「変数の名前」に使います。
これで時間が経過した後にプログラムを読み返した時に
思い出しの助けとなります。
「XXX」の部分も同様で変数を使う目的の名前を含ませると、
後で読んだときにさらに助けになると思います。
例えばString型で何からの「名前」を格納するときには
Dim strName as String
などXXX→Nameとすると可読性が上がると思います。
他の方の回答でもあるように日本語の変数は使わないように
しています。

なお、変数名でアルファベット大文字、小文字混在を使うことで
変数を入力時にすべて小文字で入力したときに変数を打ち間違えていると
気づきやすくなりこれも小さい便利です。

こんにちは。私の場合は自己流ですが、ネットなど見て他の方を
参考にして今日に至っています。

ルールは簡単で変数に何を(何の型)格納するかによって変えています。
・長整数の数字を格納する場合:Dim lngXXX as Long
・文字列を格納する場合:Dim strXXX as String
・ワークシートを格納する場合:Dim Wsh as WorkSheet

などです。「変数の型」を「変数の名前」に使います。
これで時間が経過した後にプログラムを読み返した時に
思い出しの助けとなります。
「XXX」の部分も同様で変数を使う目的...続きを読む

Q変数のない変数宣言(?)について

変数を指定せず、変数を宣言(?)するのは、C++言語の仕様として適切なものでしょうか。
言葉では説明しづらいので、例を示します。

Dataクラスを使用する場合、通常は

  Data data(100); // (1)

というように使用すると思いますが、これを

  Data(100); // (2)

と記述するのは、C++言語の仕様上、適切でしょうか。

また、(2)の記述方法は何か名称がありますか。

Aベストアンサー

ああそうそう,
Data(100)
のようにすると (実質的に) 「Data型の定数」というイメージだね. ちょうど
5
と書くと int型の定数になるのと同じようなものだと思えばいいよ.

Q【Java】参照型で宣言された変数名の抽出

現在、Javaを学習中の大学生です。

Javaのソースコードを解析し、その中で宣言されている変数名を抽出して、
変数表のようなものを作成するJavaプログラムを書いているのですが、
参照型(クラス型)で宣言されている変数名を抽出する方法が思いつきません。
よろしければ、何かアイディアをいただけないでしょうか。

プリミティブ型の変数については、StreamTokenizerクラスを利用しています。
コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
するという、単純な方法を使っています。こちらも、改良すべき点などあれば、
アドバイスいただけるとありがたいです。

デバッガを使えば出来ないことはないようですが、
出来ればデバッガは使わない方法でお願いします。

Aベストアンサー

ひとまず
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
この方法だとローカル変数も抽出してしまうと思いますが
ローカル変数も抽出の対象にするんでしょうか?

ローカル変数を対象としないなら、alice_asahina様の回答にある様にリフレクションが楽でしょう。
ただし、その場合は抽出元がソースコードでは無くクラスファイルになる事に注意して下さい。

あくまでソースコードを対象として処理するのであれば、
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
でしなければならない事の概要としては間違っていないと思いますが、
実装の上ではjavaがフリーフォーマットである事に注意して下さい。
型名の途中にホワイトスペースが挟まる事はありませんが、配列の場合こんな書き方も出来ますので。

int a
[
];

また、その際にローカル変数を抽出の対象にしないのであれば、
更に宣言スコープ等を考慮する必要が出てきますし、
これに内部クラスや匿名クラスのフィールドも混ざってくると非常にややこしい事になると思いますが、不可能ではありません。
がんばってください。

ひとまず
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
この方法だとローカル変数も抽出してしまうと思いますが
ローカル変数も抽出の対象にするんでしょうか?

ローカル変数を対象としないなら、alice_asahina様の回答にある様にリフレクションが楽でしょう。
ただし、その場合は抽出元がソースコードでは無くクラスファイルになる事に注意して下さい。

あくまでソースコードを対象として処理するのであれば、
>コードをトークンに分解して、型名の次に来るワードトークン...続きを読む

Q同じ名前の外部変数定義

C言語で、何個かのファイルに同じ型、同じ名前のstatic型の外部変数定義があっても大丈夫ですか?
static型でなかったら駄目だと思うのですが、static型ならいい気もしてきて悩んでます。宜しくお願いします。

Aベストアンサー

staticな大域変数は、ファイルの中が有効範囲なので、ファイルが違えば(同じ名前でも)大丈夫です。

QC言語のfloat型変数の値代入と表示について

float型変数の値代入と表示について質問があります。

#include <stdio.h>

int main(void)
{
 float flVal = 50.456;
 printf("float型変数:%f", flVal);
 return 0;
}

上記を実行すると、「float型変数:50.456001」と表示されました。
また、float flVal = 50.1; と変えて実行すると、「float型変数:50.099998」と表示されました。

それぞれ期待していた結果は、
「float型変数:50.456000」、「float型変数:50.100000」だったのですが
代入した値と結果が微妙に異なる理由は何でしょうか。よろしくお願いします。

Aベストアンサー

IBMのページから
http://www-06.ibm.com/jp/domino04/lotus/support/faqs/faqs.nsf/all/729933
基本的に小数点以下の数値を含むものは(0.5,0.25、0.125などを除き)、誤差が生じるため。

実際の浮動小数点演算プログラムでは、許容できる範囲であれば一致しているとみなして処理を行うことが多い。

irb(rubyの対話型インタプリタ)やpythonのプロンプトで
irb> 0.1 +0.2 == 0.3 (Enter) とすると
falseが返る。

金額計算などでは単位未満(日本での銭単位とか)を扱う場合はこれでは困るので、小数点以下でも有効桁数内では誤差が生じない固定小数点型が用いられる。

COBOLが何のかんのと言われながら、勘定系取引でシェアが高かったのも基本が固定小数点型を採用していた事が大きい

SQLでも整数型、浮動小数点型、固定小数点型みんなあります。
(Oracleは長いこと、固定小数点型で全部こなしてましたが)

JavaではBigDecimalクラスが固定小数点です。ただ、Java演算子のオーバーロードが出来ないので、いちいちadd、sub、multiply、divideメソッドを使わなければならないのがちょっと面倒。

.Net Framwork( VB.NET、C# )のdecimalクラスの方が直感的かもしれない。

ちなみにrubyにもあります。
http://www.ruby-lang.org/ja/man/html/BigDecimal.html

IBMのページから
http://www-06.ibm.com/jp/domino04/lotus/support/faqs/faqs.nsf/all/729933
基本的に小数点以下の数値を含むものは(0.5,0.25、0.125などを除き)、誤差が生じるため。

実際の浮動小数点演算プログラムでは、許容できる範囲であれば一致しているとみなして処理を行うことが多い。

irb(rubyの対話型インタプリタ)やpythonのプロンプトで
irb> 0.1 +0.2 == 0.3 (Enter) とすると
falseが返る。

金額計算などでは単位未満(日本での銭単位とか)を扱う場合はこれでは困るので、小数点以下でも...続きを読む

Q・関数内で宣言された変数の扱い(C入門本の説明で)

 以下C言語入門書の説明ですが!
 いまいちわかりません?
 
・関数内で宣言された変数の扱い
関数内で宣言した関数は、その関数内でのみ有効な変数になります。関数が異なれば、同じ変
数名で宣言することができます。例えば、main関数と(?)kansuu関数で、同じ(?)hennsuuという名
前の変数を宣言することができます。
 int main()
{
int (A)hensuu = 0;
(B)kansuuu(1);
}
int (C)kansuu(int hikusuu)
{
int (D)hensuu = 10;
}
 列のmain関数で宣言されている(?)hensuuと、さ(?)kansuu関数で宣言されている(?)hensuuは
同じ名前ですが、独立した異なるものです。(?)kansuu関数が実行されているときに、(?)hensuuの値
を変更しても、main関数で宣言されている(?)hensuuの値は変更されません。
また、(?)kansuu関数を実行している間だけ、(?)kansuu関数で宣言されている(?)hensuuが有効です。
(?)kansuu関数から呼び出し元でるmain関数に戻った際は、(?) kansuu関数で宣言した
(?)hensuuはもう有効ではなくな、値を参照することもなくなります。
  
 以上の説目で、
  (A)hensuu、 (B)kansuuu、(C)kansuu、(D)hensuu
 (アルファベット)を分かりやすいよう追加しました。
  説明の
  (?)にプログラムの(A)~(D)をつけたらどうなるか知りたいです。
(何となくわかるですが?)

  よろしくお願いします。

 以下C言語入門書の説明ですが!
 いまいちわかりません?
 
・関数内で宣言された変数の扱い
関数内で宣言した関数は、その関数内でのみ有効な変数になります。関数が異なれば、同じ変
数名で宣言することができます。例えば、main関数と(?)kansuu関数で、同じ(?)hennsuuという名
前の変数を宣言することができます。
 int main()
{
int (A)hensuu = 0;
(B)kansuuu(1);
}
int (C)kansuu(int hikusuu)
{
int (D)hensuu = 10;
}
 列のmain関数で宣言されている(?)hensuuと、さ(?)kansuu関数で宣言されてい...続きを読む

Aベストアンサー

関数内で宣言した関数は、その関数内でのみ有効な変数になります。関数が異なれば、同じ変
数名で宣言することができます。例えば、main関数と(C)kansuu関数で、同じ(A, D)hennsuuという名
前の変数を宣言することができます。
 int main()
{
int (A)hensuu = 0;
(B)kansuuu(1);
}
int (C)kansuu(int hikusuu)
{
int (D)hensuu = 10;
}
 列のmain関数で宣言されている(A)hensuuと、さ(C)kansuu関数で宣言されている(D)hensuuは
同じ名前ですが、独立した異なるものです。(C)kansuu関数が実行されているときに、(D)hensuuの値
を変更しても、main関数で宣言されている(A)hensuuの値は変更されません。
また、(C)kansuu関数を実行している間だけ、(C)kansuu関数で宣言されている(D)hensuuが有効です。
(C)kansuu関数から呼び出し元でるmain関数に戻った際は、(C) kansuu関数で宣言した
(D)hensuuはもう有効ではなくな、値を参照することもなくなります。

関数内で宣言した関数は、その関数内でのみ有効な変数になります。関数が異なれば、同じ変
数名で宣言することができます。例えば、main関数と(C)kansuu関数で、同じ(A, D)hennsuuという名
前の変数を宣言することができます。
 int main()
{
int (A)hensuu = 0;
(B)kansuuu(1);
}
int (C)kansuu(int hikusuu)
{
int (D)hensuu = 10;
}
 列のmain関数で宣言されている(A)hensuuと、さ(C)kansuu関数で宣言されている(D)hensuuは
同じ名前ですが、独立した異なるものです。(C)kansuu関数が実行されてい...続きを読む

Q 日付型なら変数の先頭になんてつけてますか?

変数名で、
文字列型なら
Dim str組織名 As String
数値型なら
Dim intNo As Long
としてるのですが、
日付型なら変数の先頭になんてつけてますか?

Dim date月日 As Date
にしようかなと思ったのですが
なんかくどいかなって感じます。

Aベストアンサー

 ご質問のカテゴリが [デジタルライフ] - [ソフトウェア] - [Office系ソフト] ですので「VBA(Visual Basic for Applications)」でのお話しとして回答いたします。

 Office 系の解説で有名な「インストラクターのネタ帳」に
●変数のプレフィックス一覧
http://www.relief.jp/itnote/archives/001268.php
というページがありますが、ここに、

'-- ここから引用------------------------------------------------------
対象:Visual Basic for Applications

変数名にデータ型がわかるようなプレフィックス(プリフィックス)をつける記述スタイルがありますが、どのデータ型のときにどんなプレフィックスをつけるか、Microsoftのサイトを元に一覧にまとめておきます。
'-- ここまで引用------------------------------------------------------
として、
データ型/プレフィックス/変数の例
文字列型 (String)/str/strFName
日付型 (Date)/dtm/dtmStart
のように掲載されています。

 ちなみに、上記ページにある論拠としての「Microsoftのサイト」ですが、リンク切れになっておりますので、こちらをご覧ください。
http://web.archive.org/web/20050309034601/http://www.microsoft.com/japan/developer/library/VBCon98/vbconconstantvariablenamingconventions.htm

 ご質問のカテゴリが [デジタルライフ] - [ソフトウェア] - [Office系ソフト] ですので「VBA(Visual Basic for Applications)」でのお話しとして回答いたします。

 Office 系の解説で有名な「インストラクターのネタ帳」に
●変数のプレフィックス一覧
http://www.relief.jp/itnote/archives/001268.php
というページがありますが、ここに、

'-- ここから引用------------------------------------------------------
対象:Visual Basic for Applications

変数名にデータ型がわかるようなプレフィックス...続きを読む

Q[C++]クラスの宣言と定義の違いって?

クラスの宣言と定義の違いってなになのでしょうか?
宣言(定義)とは具体的にどのような記載をいうのでしょうか?

いろいろ調べてこうかなっというのを記載します。
私の中では、宣言はメモリの割り当てがなされていない、宣言はメモリの割り当てがなされるという認識です。
class CSubCalss : public CSuperClass
{
public:

↑これが宣言

int main ()
{
CSubCalss a; ←これが定義

return 0;
}

Aベストアンサー

JIS X3014:2003の3.1 宣言及び定義では、次のように規定されています。

宣言は, 次の場合を除いて, 定義という。
 - 関数本体を指定せずに関数を宣言している場合
 - extern指定子又は<<結合指定>>を含んでいて, <<初期化子>>も<<関数本体>>も含んでいない場合
 - クラス宣言の中で静的データメンバを宣言している場合
 - 型定義宣言, <<using宣言>>又は<<using指令>>の場合

すなわち、クラス指定子は上記の例外に該当しませんので、常に定義ということになります。しかも、不完全型の場合も上記に挙がっていませんが、その後に定義でない例として記述されていますので、定義ではありません。また、定義というのは宣言の一種です。

簡単にいうと、クラスの宣言というのは、

class CSubClass;

であり、定義というのは、

class CSubCalss : public CSuperClass
{
public:
};

のことになります。

CSubClass a;

というのは、オブジェクトaの定義であって、クラスCSubClassの宣言でも定義でもありません。

JIS X3014:2003の3.1 宣言及び定義では、次のように規定されています。

宣言は, 次の場合を除いて, 定義という。
 - 関数本体を指定せずに関数を宣言している場合
 - extern指定子又は<<結合指定>>を含んでいて, <<初期化子>>も<<関数本体>>も含んでいない場合
 - クラス宣言の中で静的データメンバを宣言している場合
 - 型定義宣言, <<using宣言>>又は<<using指令>>の場合

すなわち、クラス指定子は上記の例外に該当しませんので、常に定義ということになります。しかも、不完全型の場合も上...続きを読む

Q変数の型を定義しなかった場合どうなりますか?

現在、VBAを使ってプログラミングを行っているところなのですが、
一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、このように型を定義しなくとも使うことが出来ます。もし定義しなかった場合、その変数の型は何に設定されているのでしょうか?
では型を定義するメリット及び、せずに使った場合のデメリットは何なのでしょうか?

私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?

Aベストアンサー

こんばんは。

>一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、

もし、入門者に対して、そのようなことを言う人は、経験のあるインストラクターではないと思います。有名な教本などには、そのようなことは書かれていないはずです。

変数を使う時の問題点をあえて書かせていただきます。

私は、今のところ、VBA専門の回答をしていますが、VBAの入門レベルの人は、変数のデータ型を宣言すると、初心者には分からないエラーが時々出るようになります。入門レベルでは、宣言するというのは、入力間違いを減らすために、モジュールの先頭に、Option Explicit と入れ、プロシージャ内で単に Dim 〇〇 とすればよいです。

データ型が決められていないなら、データ型の宣言しないほうが分かりやすいはずです。無理に入れたところで、初心者は、どうしてエラーが発生したか分かりません。それは、扱うデータ型のサイズなどが分からないからです。

VBAの変数のデータ型には、ほとんど、それしかないというものがあるのですが、そういう変数が分かるようになるまでは、しばらくは、テキストを参考にしたり、自分でトライアンドエラーを繰り返し、VBEditor のローカルウィンドウを確認しながら入れてもらうしかありません。ローカルウィンドウには、Variant/Long とか、本来のデータ型が出てきます。

私は、そういう話は、決まりきったことであっても、説明するのは面倒だと思うことが多いです。私は、あまり入門者に対しては教えることはしませんが、分からなければ、あえて使わなくてもよいと言います。

今のPCのスペックで、変数を宣言しないからといって、言うほどの大きな違いがあるとは思えません。Variant 型やString 型は、2Gまでの余裕があるのですが、VBAでは、それ以前に、アプリケーションがVBAに割付されたメモリの制限があり、そこでトラブってきてしまいます。まず、変数自体で、どうこうなるとは思えないです。

本格的には使いこなしは、建前論ではなく、本来、明示的に入れないと意味がありません。

主に、丸め誤差に対してデータ型のゆらぎが発生します。
'-------------------------------------------
'計算結果はどれも 0 となるはずです

Sub Sample1()
  Dim dbl_A As Double
  Dim sng_B As Single
  Dim cur_C As Currency
  Dim var_D As Variant
'リテラル値は変数型に影響を受けます。
'Variant型にしておいて、リテラル値に型宣言文字を使用するのは関心しません。
  dbl_A = 0.5 - 0.4 - 0.1
  sng_B = 0.5 - 0.4 - 0.1
  cur_C = 0.5 - 0.4 - 0.1
  var_D = 0.5 - 0.4 - 0.1
End Sub
'-------------------------------------------

>私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?

プログラミング言語自体は、ほとんどデータ型の宣言をしないといけないと思います。それだけ、前提となる敷居が高いということです。

逆に、VBAの親戚のVBScript の場合は、データ型の宣言が出来ません。それだけに、例えば、文字と数字の比較は、そのまま比較してはならないわけです。VBAの場合も本来は、If 文字 = 数字 Then という比較すること自体が間違いのはずですが、それがまかり通ってしまうのですから、そういう点でデータ型があやふやになってしまっているわけです。だから、そういうアプリケーションの便利な機能に助けられてコードが成り立っているわけですから、厳密に大きな問題にはならないと思います。

'-------------------------------------------
'VBAサンプルプログラム(本来は、間違いのはずです)

Sub Sample2()
Dim i As Long
Dim j As String
i = 1
j = "1"
If i = j Then
 MsgBox "OK"
Else
 MsgBox "different"
End If
End Sub
'-------------------------------------------

こんばんは。

>一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、

もし、入門者に対して、そのようなことを言う人は、経験のあるインストラクターではないと思います。有名な教本などには、そのようなことは書かれていないはずです。

変数を使う時の問題点をあえて書かせていただきます。

私は、今のところ、VBA専門の回答をしていますが、VBAの入門レベルの人は、変数のデータ型を宣言すると、初心者には分からないエラーが時々出るよ...続きを読む

Q配列変数の各要素を違う変数名で再定義するには

Cプログラム初心者です。よろしくお願いします。
配列dm_dat[1000]の各要素を違う変数名(連続した)DM0からDM999の変数名で再定義したいのですが(グローバル変数として)、#define DM0 dm_dat[0]~#define DM999 dm_dat[999]を実際に入力するのはいやなので、他に簡単にすませる方法はないでしょうか?DM0でなくDM(0)なら#define DM(i) dm_dat[i]とできるのですが・・初心者には難しいです。
どなたか、教えてくださるとありがたいです。

Aベストアンサー

#2です。

> 回答の方法では変数名の変換になりません。そして関数内で展開しても
> 他で変数DM0から1000は使うのでコンパイルするとエラーになってしまいますが・・グローバル変数としてつかいたいのですが・・

意味がわかりません。
提示したプログラムを実行すれば、DM0からDM999のマクロ定義が出力されますので、それをヘッダファイル(例えばdm_dat.hのような名前にする)として保存し、それを各ソースファイルからインクルードすればよいのです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報