
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を探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語4
-
C言語で、 printf()とwhile文を...
-
#include <stdio.h>int main(vo...
-
#include <stdio.h> #include <...
-
この列挙体で下の関数はあって...
-
C言語のコードを教えて下さい。...
-
#include <stdio.h> #include <...
-
関数へのポインタ
-
for next文、do while文、if文...
-
char * p char *pは何が違うの...
-
C言語3
-
#include <stdio.h> #include <...
-
100バイトのバイナリファイルを...
-
pingの結果を取得する方法
-
間接参照のレベルが異なっています
-
C言語 バイナリファイルをfloa...
-
C言語のsendとrecv
-
最近のCPUのほとんどはリトルエ...
-
テキストデータをそのままバイ...
-
enumの記述について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
テキストデータをそのままバイ...
-
2曲同時再生するにはどうした...
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
間接参照のレベルが異なっています
-
charでの計算?
-
c言語プログラミング実行時エラ...
-
double型の値をchar配列に変換...
-
str系関数を使わずに二つの文字...
-
間接操作のレベルとは
-
3桁区切(コンマ)記号をつけ...
-
iconv_open失敗
-
【C言語】構造体内の領域解放(...
-
ftoa の作り方
おすすめ情報