回答編集履歴

5

typo修正T\*\*->T\*

2016/11/19 11:32

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -18,4 +18,4 @@
18
18
 
19
19
  追記:
20
20
 
21
- yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」という表現と「T[]がT**とほぼ同じ」だと思ったので表現を改めました。要するに自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点でした。
21
+ yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」「`T[]``T*`とほぼ同じ」という表現だと思ったので表現を改めました。要するに自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点でした。

4

誤解を招く表現を訂正

2016/11/19 11:32

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,4 +1,4 @@
1
- Cでは配列のサイズは常にわかるわけではなく「未知」な場合があります。システムでのサポートは限られた文脈でのみ`sizeof`で求められるだけです。それは`T[]`が`T*`とほぼ同じものとして扱われるからです。こういう背景があるため配列の大きさを扱うには大きさを別の変数として管理するか、配列の末尾に特別なマーカーデータを置くなどの方法を採らざるを得ません。文字列をcharの配列として表現するCでは後者の方法を採用しマーカーデータとしてナル文字を使うことにしました。太古の昔に制定された文字コードではNUL文字(文字コード=0x00)は「何もない文字」という意味合いがあったからなのだと思います。
1
+ Cでは配列のサイズは常にわかるわけではなく「未知」な場合があります。システムでのサポートは限られた文脈でのみ`sizeof`で求められるだけであり、特に関数間で引き渡際には`T[]`が`T*`とほぼ同じものとして扱われてしまいます。こういう背景があるため配列の大きさを扱うには大きさを別の変数として管理するか、配列の末尾に特別なマーカーデータを置くなどの方法を採らざるを得ません。文字列をcharの配列として表現するCでは後者の方法を採用しマーカーデータとしてナル文字を使うことにしました。太古の昔に制定された文字コードではNUL文字(文字コード=0x00)は「何もない文字」という意味合いがあったからなのだと思います。
2
2
 
3
3
 
4
4
 
@@ -18,8 +18,4 @@
18
18
 
19
19
  追記:
20
20
 
21
- yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」という表現だと思ったので「未知の場合がある」に改めました。「一般に(どんな場合でも)分かるとは限らない」と言おうとしたのですが表現が不適切でした。
22
-
23
-
24
-
25
- yohhoyさんがおっしゃりたいことは配列のサイズわからないというのは間違いいう意味だと思そのとおりなのでが、自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点だっのです
21
+ yohhoyさんからご指摘誤解を招い部分「一般に未知」という表現「T[]がT**とほぼ同じ」だと思ったので表現を改めしたるに自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点でした。

3

補足

2016/11/19 09:35

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,4 +1,4 @@
1
- Cでは配列のサイズは一般に「未知」システムでのサポートは限られた文脈でのみ`sizeof`で求められるだけです。それは`T[]`が`T*`とほぼ同じものとして扱われるからです。こういう背景があるため配列の大きさを扱うには大きさを別の変数として管理するか、配列の末尾に特別なマーカーデータを置くなどの方法を採らざるを得ません。文字列をcharの配列として表現するCでは後者の方法を採用しマーカーデータとしてナル文字を使うことにしました。太古の昔に制定された文字コードではNUL文字(文字コード=0x00)は「何もない文字」という意味合いがあったからなのだと思います。
1
+ Cでは配列のサイズはわかるわけではなく「未知」な場合があります。システムでのサポートは限られた文脈でのみ`sizeof`で求められるだけです。それは`T[]`が`T*`とほぼ同じものとして扱われるからです。こういう背景があるため配列の大きさを扱うには大きさを別の変数として管理するか、配列の末尾に特別なマーカーデータを置くなどの方法を採らざるを得ません。文字列をcharの配列として表現するCでは後者の方法を採用しマーカーデータとしてナル文字を使うことにしました。太古の昔に制定された文字コードではNUL文字(文字コード=0x00)は「何もない文字」という意味合いがあったからなのだと思います。
2
2
 
3
3
 
4
4
 
@@ -11,3 +11,15 @@
11
11
 
12
12
 
13
13
  なお実際は文字配列を確保すると全ての要素がナル文字で初期化されますがそれは文字列の終端をナル文字で表すからではなくプログラムの実行結果の再現性を確保するために何か決まった文字で初期化するという意味合いだと思います。
14
+
15
+
16
+
17
+ ---
18
+
19
+ 追記:
20
+
21
+ yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」という表現だと思ったので「未知の場合がある」に改めました。「一般に(どんな場合でも)分かるとは限らない」と言おうとしたのですが表現が不適切でした。
22
+
23
+
24
+
25
+ yohhoyさんがおっしゃりたいことは配列のサイズがわからないというのは間違いという意味だと思います。そのとおりなのですが、自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点だったのです。

2

表現変更

2016/11/19 09:29

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 一方Javaではご存知のようにポインターはなく任意の配列`T[]`は「配列」としてしか扱われません(Cプログラマー向けの説明のでJavaしか知らなプログラマーとって意味不明かもしれません...)。`T[]`は正確な大きさが`length`でいつでも参照できるようになっています。こういった背景があるため文字列の終端を表す目的でナル文字のようなマーカーデータを用いる必然性がなくそうする習慣もありませんし実際入ってもいません。
5
+ 一方Javaではご存知のようにポインターはなく任意の配列`T[]`は「配列」としてしか扱われません(Cに馴染みがない意味不明な説明ですが...)。`T[]`は正確な大きさが`length`でいつでも参照できるようになっています。こういった背景があるため文字列の終端を表す目的でナル文字のようなマーカーデータを用いる必然性がなくそうする習慣もありませんし実際入ってもいません。
6
6
 
7
7
 
8
8
 

1

誤記訂正

2016/11/19 07:46

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- こうした背景のためCで"abc"と記述した場合に実際の大きさが4で最後にナル文字が入るといった仕様はJavaにはなく、Javaで"abc"と記述した場合は(char[]ではなくStringになりますが)Stringの内部にあるchar[]の大きさは4ではなく3であって4文字目にナル文字が入る余地も必要もないのです。
9
+ Cで"abc"と記述した場合に実際の大きさが4で最後にナル文字が入るといった仕様はJavaにはなく、Javaで"abc"と記述した場合は(char[]ではなくStringになりますが)Stringの内部にあるchar[]の大きさは4ではなく3であって4文字目にナル文字が入る余地も必要もないのです。
10
10
 
11
11
 
12
12