K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[1798] Re:char hoge = 'A';
投稿者:774RR
2012/02/28 09:42:53

出遅れ気味... C++ の場合は仕様書の文言が若干違うようです。 以下 ISO/IEC 14882:1998 ならびに JIS X3014:2003 から 2.2 - 3 基本実行文字集合 基本実行文字集合において、それぞれの文字は非負の互いに異なる値をもっていなければならない。 実行文字集合は、基本実行文字集合をその部分集合とする集合とする。 実行文字集合における文字の値は、処理系定義とする。 俺:この文言は [基本文字集合は非負の値] [基本でない文字集合は負でもよい] と読むべきなのだろう・・・ 2.13.2 文字リテラル 文字リテラルは型 char をもち、実行文字集合での符号数値に等しい値を持つ。 俺:C の 6.4.4.4 の例のような文言は無いな・・・ 3.9.1 基本型 char として宣言されたオブジェクトの大きさは、処理系定義である実行文字集合のすべての要素を 格納するのに十分なだけ大きくなければならない。 char オブジェクトが負の値をもてるか否かは、処理系定義とする EBCDIC およびその派生な文字セットの場合 'A'=h'C1, '0'=h'F0 なので、 [基本文字集合は非負の値] からいくと「単なる char は符号なし」しかダメなんだろう。 ただ、実処理系で確認しようにもいろいろ微妙かも。 すぐ使える場所に EBCDIC な処理系は無いし printf("%d\n", '\xF0'); とすると [汎整数拡張] 後の int 型の値確認にしかならないし cout << '\xF0'; だと[文字表記]になって[文字の値]ではないし cout << int('\F0'); だと同 int の確認だし
[この投稿を含むスレッドを表示] [この投稿を削除]
[1797] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/28 03:28:44

># でもEOFとかち合ったりしないのかなぁ…… ここだけ見て、規格にこっそり「charがsignedな処理系では1バイト文字定数は0xFFになってはいけない」みたいなことが書いてないかなあと見てみたのですが書いてなく、それどころか上記引用部には堂々と0xFFのケースが書いてあるわけですが、EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 (いつものことですが)私も勉強させていただいております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1796] Re:char hoge = 'A';
投稿者:yuya
2012/02/27 12:37:08

すみません、たぶん自己解決しました。 JIS X3010:2003 6.4.4.4 文字定数 | |意味規則 単純文字定数は、型intをもつ。 |(中略) |単純文字定数が単一の文字又は逆斜線表記を含む場合、その値はその単一の文字又は逆斜線表記の値をもつ |char型のオブジェクトをint型に変換したときの結果の値とする。 |(中略) |例2. 整数に対し2の補数表現を用い、型charをもつオブジェクトに対して8ビットを用いる処理系を考える。 |型charがsigned charと同じ範囲の値をもつ処理系では、単純文字定数'\xFF'は値-1をもつ。型charが |unsigned charと同じ範囲の値をもつ場合、'\xFF'は値+255をもつ。 この例2を見ると、文字定数の値が、「charがsignedかunsignedか」に連動して定まることになりますね。つまり、int型のモノが「char型に対する扱い」に依存するんですね。知りませんでした。 ということは、無印のcharがsignedの処理系であろうとunsignedの処理系であろうと、文字定数を代入して値が変わってしまう心配はない、と。 一番気になっていたのは、「等しいはずの文字を比較したのに『等しくない』と判定されてしまうかも」ということだったのですが、これで心配はなくなりました。 # でもEOFとかち合ったりしないのかなぁ……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1795] Re:char hoge = 'A';
投稿者:yuya
2012/02/27 10:08:44

ありがとうございます。 >これが > >>char hoge[] = {'ア', 'イ', 'ウ', '\0'}; > >だったら間違いなく違和感があると思うのですが。 なるほど、考えてみれば半角カナで実験してみればよかったですね。 #include <stdio.h> int main(void){ printf("%d\n", 'ア'); return 0; } VCでコンパイルして実行すると -79 あり?どうなってるんだ・・・
[この投稿を含むスレッドを表示] [この投稿を削除]
[1794] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/27 01:45:30

どうもです。 >「A」の文字コードは決まっていないし、charがsignedになるかunsignedになるかは処理系によるので、結局この代入自体が処理系定義になるわけですよね。 確かにそうなりそうに思うのですが…… >よくchar配列の初期化の例で、 > >char hoge[] = "ABC"; > >は > >char hoge[] = {'A', 'B', 'C', '\0'}; こういう説明は私もしていますし、でも確かに処理系定義だと思います。 これが >char hoge[] = {'ア', 'イ', 'ウ', '\0'}; だったら間違いなく違和感があると思うのですが。 まあ、'A'がunsigned char側に割り当てられるような処理系はまずないだろうという前提を、たいていのCの入門書著者は置いてしまっているのだと思います。私も含めて。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1793] Re:char hoge = 'A';
投稿者:yuya
2012/02/21 04:04:30

(ぱ)さん、ありがとうございます。 「A」の文字コードは決まっていないし、charがsignedになるかunsignedになるかは処理系によるので、結局この代入自体が処理系定義になるわけですよね。 よくchar配列の初期化の例で、 char hoge[] = "ABC"; は char hoge[] = {'A', 'B', 'C', '\0'}; の略であって……といった説明になるわけですが、この場合も同様だとすると、 あれれ?そんな処理系定義な例で説明がなされているのか?と疑問に思ってしまったわけです。 (すみません、もの凄くアホな勘違いをしているかもしれません。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1792] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/21 03:15:15

すみません、しばらくここを放置してしまいました。 >C言語において、文字定数は1バイトの表現に収まることが保証されていますが、 >たとえば'A'が200のような値をとっていけないことはないですよね。 >すると、charがsignedな処理系で char hoge = 'A'; と書くと、未定義動作になるのでしょうか? 'A'自体の型はintですので、普通にintからsigned charへの型変換と考えると、 X 3010:2003の6.3.1.3によれば >そうでない場合,すなわち,新しい型が符号付き整数型であって,値がその型で表現できない場合は, >結果が処理系定義の値となるか,又は処理系定義のシグナルを生成するかのいずれかとする。 なので、処理系定義ですかね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1791] char hoge = 'A';
投稿者:yuya
2012/02/19 11:24:57

C言語において、文字定数は1バイトの表現に収まることが保証されていますが、 たとえば'A'が200のような値をとっていけないことはないですよね。 すると、charがsignedな処理系で char hoge = 'A'; と書くと、未定義動作になるのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1790] fd
投稿者:aa
2012/02/16 19:29:55

fd
[この投稿を含むスレッドを表示] [この投稿を削除]
[1789] test
投稿者:test
2012/02/05 21:15:15

test
[この投稿を含むスレッドを表示] [この投稿を削除]
[1788] 無題
投稿者:くそ河野
2012/01/23 13:50:01

cvgcgdghdgおっぱ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1787] 無題
投稿者:くそ河野
2012/01/23 13:49:22

ああああなんあなん
[この投稿を含むスレッドを表示] [この投稿を削除]
[1786] 無題
投稿者:キリン
2012/01/23 13:49:13

tinkoとmankoを合体させよう
[この投稿を含むスレッドを表示] [この投稿を削除]
[1785] 無題
投稿者:くそ河野
2012/01/23 13:48:52

おppai
[この投稿を含むスレッドを表示] [この投稿を削除]
[1784] 無題
投稿者:はなくそ
2012/01/23 13:48:15

どうもはなくそです
[この投稿を含むスレッドを表示] [この投稿を削除]
[1783] 無題
投稿者:キリン
2012/01/23 13:47:21

鼻隠せ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1782] 無題
投稿者:くそ河野
2012/01/23 13:46:48

河野、がやべぇ鼻の中ほじくりまはわしてる
[この投稿を含むスレッドを表示] [この投稿を削除]
[1781] 無題
投稿者:くそ河野
2012/01/23 13:45:25

mんこのー  おしりのなかを  なまないでくださいー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1780] 無題
投稿者:キリン
2012/01/23 13:45:17

鼻の整形をひきうけましょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1779] 無題
投稿者:くそ河野
2012/01/23 13:43:57

ぱぱぱぱぱぴい
[この投稿を含むスレッドを表示] [この投稿を削除]
[1778] 無題
投稿者:キリン
2012/01/23 13:43:37

河野逃げるな
[この投稿を含むスレッドを表示] [この投稿を削除]
[1777] 無題
投稿者:
2012/01/23 13:42:10

鼻くそ見えてるよ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1776] 無題
投稿者:キリン
2012/01/23 13:41:50

鼻デカ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1775] 無題
投稿者:くそ河野
2012/01/23 13:41:04

ま こ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1773] 無題
投稿者:
2012/01/23 13:39:28

鼻でか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1772] 無題
投稿者:くそ河野
2012/01/23 13:39:24

洋一郎が怒られるのこわいからにげた
[この投稿を含むスレッドを表示] [この投稿を削除]
[1771] 無題
投稿者:くそ河野
2012/01/23 13:37:51

まえののー  おしりのなかを  なめないでくださいー そこに
[この投稿を含むスレッドを表示] [この投稿を削除]
[1770] 無題
投稿者:
2012/01/23 13:37:27

鼻でか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1769] 無題
投稿者:you
2012/01/23 13:37:06

どうすんの?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1768] 無題
投稿者:くそ河野
2012/01/23 13:36:36

あああ
[この投稿を含むスレッドを表示] [この投稿を削除]