回答編集履歴

1

コメントなどをもとに推測を追加

2017/09/16 00:31

投稿

raccy
raccy

スコア21733

test CHANGED
@@ -44,7 +44,11 @@
44
44
 
45
45
 
46
46
 
47
- つまり、`int`などについては普通に囲むことはANSI規格の時点で認められており、カーニハンとリッチーとしては想定通りだったようです。ただし、この後の文字列リテラルによる文字配列に関する部分ではこの注意書きのような記述はありません。
47
+ つまり、`int`などについては普通に囲むことはANSI規格の時点で認められており、カーニハンとリッチーとしては想定通りだったようです。ただし、**この後の文字列リテラルによる文字配列に関する部分ではこの注意書きのような記述はありません**
48
+
49
+
50
+
51
+ ※ Harahinaさんの情報によると初版でも上の文言はそのままあるようです。
48
52
 
49
53
 
50
54
 
@@ -52,7 +56,63 @@
52
56
 
53
57
 
54
58
 
55
- ということでANSI(C89)の時点では文字列リテラルを用いた初期化においては波括弧でも囲んでもよいとは言えった可能性があります。くとも、カーニハンとリッチーはそれが許されるとは想定してなかった可能性が高いです。あとは、C89->C90(ANSIをISOに章立てを直しただけ)->C99->C11の変遷を見ていくしかないのですが、ANSIの入手先はわからないし、C90以降のISO規格書は有料なので調べ尽くすことはできませんでした。
59
+ ということですが、yuki23さんの情報によると、ANSI(C89)の時点では文字列リテラルを用いた初期化においては波括弧でも囲んでもよいとなっていとのことです。ですが、K&Rにはそのよう記述が無い事から、カーニハンとリッチーはそれが許されるとは想定してなかった可能性が高いです。
60
+
61
+
62
+
63
+ そもそもK&R(第二版 4.9 初期化 p.105)では
64
+
65
+
66
+
67
+ ```C
68
+
69
+ char pattern[] = "ould";
70
+
71
+ ```
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ ```C
80
+
81
+ char pattern[] = {'o', 'u', 'l', 'd', '\0'};
82
+
83
+ ```
84
+
85
+
86
+
87
+ と同値な簡略形としています。では、
88
+
89
+
90
+
91
+ ```C
92
+
93
+ char pattern[] = {"ould"};
94
+
95
+ ```
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ ```C
104
+
105
+ char pattern[] = {{'o', 'u', 'l', 'd', '\0'}};
106
+
107
+ ```
108
+
109
+
110
+
111
+ となるのかというと、後者はコンパイルエラーになります。普通の配列に対して余計な波括弧を足すことはできません。
112
+
113
+
114
+
115
+ **ここからは私の単なる推測です。**K&Rでは配列に対して、波括弧で囲んでリストを作るとしています。そして、文字配列については文字列リテラルでも初期化できるとしています。これを読んだCコンパイラの開発者が、何を思ったのか、「文字配列は配列だから、初期化子を波括弧で囲む必要があるけど、文字列リテラルも使えると言うことだから、波括弧の中で文字列リテラルを書けば良いんだ」と解釈したのでは無いでしょうか?つまり、`char pattern[] = {"ould"};`が正当であると。標準規格が定まる前の言語というのは、複数の実装が存在すると、それぞれが自分たちもそれができるという競争状態になります(JavaScriptが良い例です)。C言語もそのような状態であったため、うちのコンパイルでもできるとして広まっていったのかも知れません。ANSI制定にあたり、既存のコンパイラの実装状況の調査を行った時、既に普及している解析手法であったため、これは外せないとなったのが真相では無いかと思います。
56
116
 
57
117
 
58
118