「C言語/データ型と変数の高度な話題」の版間の差分

削除された内容 追加された内容
→‎enum: ;特定の値の割り当て指示 enumの要素の値を、コンパイラに自動的に割当させるのではなく、プログラマーが自分で決定することもできます。
Ef3 (トーク | 投稿記録)
→‎enum: nDay_of_the_Week の意味
タグ: 2017年版ソースエディター
704 行
あるいは別の方法を試みようとして、たとえば外側をenumブロック、その内側に構造体ブロックを入れても、構造体の定義の際にメンバに int 型などを定義しなければいけなくなるので、コンパイル不能で動作しないか、もし仮にコンパイルできたとしても意図しない動作になりかねないので危険であろう。
 
;特定の値の割り当て指示
enumの要素の値を、コンパイラに自動的に割当させるのではなく、プログラマーが自分で決定することもできます。
<code>dwTHURSDAY =10,</code> のように、割り当てたい要素のところで代入の書式で書きます。なお、0から5までの他の曜日で使用済みの番号を割当ようとしても(6ではなく5なのは、割り当てた曜日自身も順番からは除外されるので)、警告が出るので使用するのは危険です(少なくともFedora Linux版 gcc ではそうです)。ここら辺の仕様はコンパイラ依存の可能性が高いので、あまり多用しないほうが安全だと思います。このためまた、enumの各要素に値を割り当てる場合には、その値が使用済みでないかどうか注意しなければなりません。
 
<syntaxhighlight lang="C" highlight=18 line>
#include <stdio.h>
 
enum Day_of_the_Week {
dwSUNDAY,
dwMONDAY,
dwTUESDAY,
dwWEDNESDAY,
dwTHURSDAY =10,
dwFRIDAY,
dwSATURDAY,
nDay_of_the_Week,
} dw; // enum の最後で変数を宣言
 
int main(void) {
const char *names[nDay_of_the_Week] = {
"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日",
};
for (dw = dwSUNDAY; dw < nDay_of_the_Week; dw++) { // 変数宣言はしてないので dw に型は不要になる
printf("%i: %s\n", dw, names[dw]);
}
}
</syntaxhighlight>
 
実行結果
<pre>
0: 日曜日
1: 月曜日
2: 火曜日
3: 水曜日
4: 木曜日
5: 金曜日
6: 土曜日
7: (null)
8: (null)
9: (null)
10: (null)
11: (null)
12: (null)
</pre>
 
<code>dwTHURSDAY =10,</code>と木曜日に10の値を割り当てたのに、その左側の番号が4となっているあたり、このコンパイラはそのような仕様らしいです。ここいらの実装はもうコンパイラ依存なので他コンパイラでは違う結果になる可能性もあるので、ご使用の際は注意してください。