
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
C言語の仕様の下書きならここで見られますので、まずは仕様をみてみる事をおすすめします。
http://www.open-std.org/jtc1/sc22/wg14/
とりあえず、最近公開されたC言語の仕様であるC11の最新の下書き (ほとんどリリースと同じだと予想しますが) はこれですね。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/ …
この6.7.2.2 Enumeration specifiersを読むと良いと思います。
| 2 The expression that defines the value of an enumeration constant shall be an integer
| constant expression that has a value representable as an int.
まず、enum定数はint型で表現できるものしか表現出来ません。
| 4 Each enumerated type shall be compatible with char, a signed integer type, or an
| unsigned integer type. The choice of type is implementation-defined, but shall be
| capable of representing the values of all the members of the enumeration.
そして、enum型はchar型、符号付きint型、符号なしint型と互換性があります。
どの型になるかはenum定数が全て入る大きさであれば実装依存です。
まあ、よほどメモリーが逼迫している環境で使うバイナリーを吐くコンパイラーでもない限りint型にするのでは?
> スタティック変数のstateを初期化するには、Start/Collect/Skip/Endでしかできないのかな?と。
見落としがあるかもしれませんが、ざっと仕様を見る限り、そういう制限は特に見つけられませんでした。
ただ、ビット数が不足してしまい、メンバーではない値を代入した場合に正しく扱える保証はない可能性があるでしょう。
> enumを型宣言として扱い、enum内で定義される数によって、スタティック変数のstateが、char/int/longとして展開されるのかなと。
実装依存ですが、仕様を見る限りではenum定数を表せる最小限の型となるべくchar / int / unsigned intを使い分けることはありえるでしょう。
ただ、long型との互換性は無さそうです。
早々教えていあただいたページチェックしたいと思います。改めて新しくわかた事がありましたら、ご報告させていただきます。御回答ありがとうございました。
No.2
- 回答日時:
C言語の仕様で、static変数は暗黙のうちにゼロに初期化されます。
この場合、変数stateの初期値はStartです。名前空間が違うので問題ないですが、変数名が state で、型名(enumのタグ名)も同じ state というのは、あまり良くない名前の付け方ですね。
No.1
- 回答日時:
enum型の定数は特に指定がない限り先頭を基準として0から始まる整数値の定数が割り当てられます(増加値は1)。
なので、Startは0、Collectは1(以下略)のような意味になります。
標準出力に出力してみるとどうなっているかが分かりやすいかと思います。
この回答への補足
早々の御回答ありがとうございます。
アップしてから自分なり考えていたのですが、使われ方としたら、下記のような宣言したのと同じような扱いなのです。で、思ったのが、スタティック変数のstateを初期化するには、Start/Collect/Skip/Endでしかできないのかな?と。それで#define OTHERS 100;として、state=OTHERとなるか調べてみたのですが、OKのようでした。
enum state {
Start,
Collect,
Skip,
End
} state;
static int state;
で、思ったのですが、enumを型宣言として扱い、enum内で定義される数によって、スタティック変数のstateが、char/int/longとして展開されるのかなと。2日ほど前から悩んでいまして、本質問をアップして後、再度熟考してみたら、上のような事が閃いた次第です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
fgetsなどのときのstdinのバッ...
-
ftoa の作り方
-
テキストデータをそのままバイ...
-
c++ 文字列を入力して、一文字...
-
文字列から空白を取り除きたい...
-
間接操作のレベルとは
-
C言語 バイナリファイルをfloa...
-
【C言語】テキストファイル内の...
-
起動時の引数の取得方法が分か...
-
fgetc()関数の動作について
-
pingの結果を取得する方法
-
c言語配列の結合についてです。...
-
間接参照のレベルが異なっています
-
switch文で文字を比較すること...
-
C言語のポインターで詰まっている
-
c言語プログラミング実行時エラ...
-
配列をnビットシフトする
-
std::stringstream で得るもの...
-
sprintfに同じ変数は使えるか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体の各メンバにfor文からア...
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
間接参照のレベルが異なっています
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
charからLPTSTRへの変換方法
-
ネットワークにつながっている...
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
c言語でユーザ関数を利用して入...
-
atoi( ) の反対をやりたい
-
間接操作のレベルとは
-
-'0'の意味について
-
double型の値をchar配列に変換...
-
Linuxでフォルダ内全ファイル名...
-
配列をnビットシフトする
-
c言語でソーベルフィルタが作り...
おすすめ情報