ページ 1 / 1
文字の宣言はint型?
Posted: 2015年5月18日(月) 08:47
by amehirune
お久しぶりになります、アメヒルネと申します。
つい最近、友達からこんな質問を受けました。
「今ではC言語で文字型変数をintで扱うって本当?」
その時はわけもわからず、「は?」と聞き返してしまったのですが、
後にその友達からある1冊の本を渡され、そこに書いてあったのが
「文字をcharで宣言するのはもう古い」との記述でした。
私は結構古めのC言語入門本で勉強したこともあり、そのようなことは全く知らなかったのです。
その記事の内容はよく覚えてないのですが、何故文字をintで宣言する必要があるのかがわかりません。
メモリの割り当てでいろいろと面倒なことが起きるとかそういうモノなのかな、とか思いましたが、
個人的には見返す時に変数の型名で、この変数が何を扱っているのかを分かりやすくなるので、
charはcharで宣言する方がいいような気がしています。
別にこれがわからないからどうとかいったことはありませんが、
単なる私の知的好奇心に応える意味で、どなたかご回答いただきたく思います。
Re: 文字の宣言はint型?
Posted: 2015年5月18日(月) 09:07
by 超初級者
1文字を複数バイトで表わすことを
考慮してのことかな?
Re: 文字の宣言はint型?
Posted: 2015年5月18日(月) 09:50
by Aozora0630
超初級者 さんが書きました:1文字を複数バイトで表わすことを
考慮してのことかな?
恐らくそうだと思います。
でもマルチバイト文字ならwchar型を使えばいいと思いますが・・・。
Re: 文字の宣言はint型?
Posted: 2015年5月18日(月) 11:02
by YuO
amehirune さんが書きました:「今ではC言語で文字型変数をintで扱うって本当?」
これに関しては,正しいです。
ANSI/ISO以前の正確な知識は無いですが,Cにおける'A'などの型は,少なくともISO/IEC 9899:1990の時代からint型です。
中途半端なバージョンではありますが,ISO/IEC 9899:1999から該当箇所を引用しますと,
6.4.4.4 Character constants
Description
2 An integer character constant is a sequence of one or more multibyte characters enclosed in single-quotes, as in 'x'.
Semantics
10 An integer character constant has type int.
とあります。
C FAQ 8.9にも簡単ではありますが記述があります。
オフトピック
► スポイラーを表示
なお,C++においては1文字だけであればchar型になります。最古の規格ISO/IEC 14882:1998から該当箇所を引用しますと,
2.13.2 Character literals
1 A character literal is one or more characters enclosed in single quotes, as in 'x', optionally preceded by the letter L, as in L'x'.
A character literal that does not begin with L is an ordinary character literal, also referred to as a narrowcharacter literal.
An ordinary character literal that contains a single c-char has type char, with value equal to the numerical value of the encoding of the c-char in the execution character set.
An ordinary character literal that contains more than one cchar is a multicharacter literal.
A multicharacter literal has type int and implementationdefined value.
とあります。また,
Annex C (informative)
Compatibility
C.1 C++ and ISO C
C.1.1 Clause 2: lexical conventions
3
Change: Type of character literal is changed from int to char
Rationale: This is needed for improved overloaded function argument type matching.
For example:
コード:
int function( int i );
int function( char c );
function( 'x' );
It is preferable that this call match the second version of function rather than the first.
How widely used: Programs which depend upon sizeof(’x’) are probably rare.
とあり,C++ではオーバーロード時に単一の文字はchar型へのオーバーロードが選択された方が好ましいと思われること,さらにこれによる変化であるsizeo('A')がsizeof(int)でなくなることの影響も少ないことから,破壊的変更を許容したようです。
amehirune さんが書きました:後にその友達からある1冊の本を渡され、そこに書いてあったのが
「文字をcharで宣言するのはもう古い」との記述でした。
「古い」に関しては,根拠がわからないと判断つきかねますが,少なくとも「古い」とするのは通常の取り扱いではないです。
あり得るとすれば,逆方向 (文字定数をcharにする) の修正ですが,互換性の都合上難しいでしょう。
関数の戻り値としてcharではなくintを使うことはあり得ます。
標準関数がそうですが,charとintの表せる範囲が異なる前提で,
charの範囲外の値をintが返すことによりエラーを表すことができるためです。
---- 修正履歴 ----
20150518T1315+0900 “通常の取り扱いではないです”の前に“「古い」とするのは”を追加
Re: 文字の宣言はint型?
Posted: 2015年5月20日(水) 17:42
by amehirune
返信遅れてしまい、申し訳ありません。
やっぱりそうだったんですね…
そのISO/IEC 9899:1990の時代というのはよくわかりませんが、たぶん最近のことだろうと思っておきます。
charをintで表すのは、簡潔にいえばエラー対策、ということだったんですね。
回答ありがとうございました。
Re: 文字の宣言はint型?
Posted: 2015年5月20日(水) 18:25
by ISLe()
けっきょく「もう古い」の根拠は何ですかね。
amehirune さんが書きました:そのISO/IEC 9899:1990の時代というのはよくわかりませんが、たぶん最近のことだろうと思っておきます。
番号の最後に1990とありますから、1990年に公表された規格ということです。
25年前です。
ISO/IEC 9899:1990というのは、C言語の国際規格として『初』のものですね。
ということは
C言語で文字リテラルの型は「最初から」intであり
fgetcの戻り値をcharで受けるようなことは「最初から」間違っている
と考えるのが妥当ではないかと。
それ以外で文字をintで扱うのが良い(新しい?)場面というのが思い当たりません。
Re: 文字の宣言はint型?
Posted: 2015年5月23日(土) 10:16
by amehirune
ISLe() さんが書きました:けっきょく「もう古い」の根拠は何ですかね。
なんなんでしょうね(^^;
成程、もともとはintだったんですね。
それを、解説側が初心者にとって「わかりやすいように変形させた」ってことですかねぇ。
Re: 文字の宣言はint型?
Posted: 2015年5月23日(土) 12:20
by たいちう
著者が間違えている場合は論外なので、今は普通の著者を想定します。
(1)このような理由から、(2)こういう場合には、(3)これはこうすべきである。
というような事が書いてあったのではないでしょうか。
雑誌の記事の見出しなどが「これはこうすべきである」となっていることがよくあります。
著者は自分の記事を読んでほしいので、見出しをセンセーショナルなものにすることがあります。
一般的には「これはこうすべきでない」ということが常識とされているときに、
あえて「これはこうすべきである」という見出しを付けることもよくあります。
記事を読んだら「特殊な状況では一般的常識を無視すべきこともある」
といった程度の内容だったりします。
その場合、見出しだけを読んで『「これはこうすべきでない」というのはもう古いのだ、
今は「これはこうすべきである」が正しいんだ』と、見出しを鵜呑みにするのは間違いです。
> なんなんでしょうね(^^;
その本を読んだのはamehiruneさんでしょ。
どんな趣旨で書かれていたのか、読み直してはどうですか?
本の題名などを教えてくれないと、他の人は答えようがないと思いませんか?