質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

24363閲覧

char型で入力された文字列をint型数値に変換する式の「 - '0'」について

norm

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

1クリップ

投稿2016/02/22 03:05

現在C言語を学習中の者です。よろしくお願いします。

C言語において数字文字列を数値化する場合に
「a = a * 10 + ch[i] - '0';」という形の式をループさせている
という事を知ったのですが、その中の「 - '0'」が具体的に
何の役割をしているのかよくわかりませんでした。
これが無いと想定した表示にならないというのは
プログラムを動かして分かったのですが…

また、式を計算していく優先順位については
「a * 10」から右へ右へと順繰りに行っていくと考えて良いのでしょうか。
それともchar型だから「ch[i] - '0'」を優先させるというルールなのでしょうか。

ご返答のほど、よろしくお願いいたします。

okumurakengo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

こんにちは。

文字には文字コードと呼ばれる特定の数値が割り当てられ、その数値でコンピュータは取り扱つかってます。
半角のアルファベットや数字は現在ではほとんどASCIIコードが使われています。
リンク先を見ると、文字'0'には10進数で48、16進数で0x30という数値が割り当てられていることが読み取れます。

さて、C/C++言語では、'文字'と書くとその文字の文字コードの数値となります。(文字は半角文字を1文字だけOKです。)例えば'0'は48ですし、'9'は57となります。つまり、'9'-'0'は9となるのです。

また、式を計算していく優先順位については

「a * 10」から右へ右へと順繰りに行っていくと考えて良いのでしょうか。

演算子の優先順位に従って計算され、同じ優先順位の場合は左から順に計算されるものが多いです。(リンク先を見ると分かりますが、例外もあります。)

投稿2016/02/22 03:18

編集2016/02/22 03:26
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norm

2016/02/22 04:19

参考リンク等交えての優先順位を含めた解説と早いご返答ありがとうございました。 「- ’0’」は文字コードの差分で表現するためのものだったのですね。 計算の優先順位は型がどうこうではなく、演算子を主として考えればよいことも分かりました。
guest

0

半角英数の文字コードの引き算ですよ。
sjis,unicode,utf-8,jis など主要な文字コードの半角文字の文字コード区画が
16進数で、0x20から0x7eで共通してるから出来る技です。
'0'は、16進数で、0x20,10進数で、32です。
例示されたコードでは、10進数の範囲の文字を数値チェックして、内部表現に変換する処理なので、
'9' - '0'は、9になる。
入力で、"123" が入力され、これを文字列から数値に変換したい、なんて場合だと、
int ans=0;
ans = ans * 10 + '1'-'0';
ans = ans * 10 + '2'-'0';
ans = ans * 10 + '3'-'0';
で、ans には、数値の 123 が格納されます。

投稿2016/02/22 03:20

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norm

2016/02/22 04:25

ご返答ありがとうございました。
guest

0

C言語

1a = a * 10 + ch[i] - '0';

この式で、ch[i]と '0'は、文字コードを表しています。
ASCIIコード(半角英数を表現する標準的な文字コード)では、'0'は0x30,'1'は0x31,……,'9'は0x39というようにそれぞれが文字コードで表現されます。
こういうように数字の文字とその文字コードが関係していることを利用して、'1'という文字を、1という数値に変換するのに、'1' - '0' = 0x31 - 0x30 = 1 と計算する訳です。(同様に'0'から'9'の文字を、0から9に変換できるのは、お分かりになると思います)

投稿2016/02/22 03:27

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norm

2016/02/22 04:25

ご返答ありがとうございました。
guest

0

まず、大前提として、char型も数値型の一種です。char配列の要素も'0'のような文字定数も、ふつうに数値として計算が可能です。

では、この文字列を入れたはずのところに入っている「数値」とは何かと言えば、文字コードです。C言語では特にどの文字コードを使うという決まりはないのですが、数少ない規定の1つとして、「0〜9のコードは連続している」ということがあります。

たとえば、ASCIIという文字コードでは、文字「0」が48番、「1」が49番…「9」が57番というようになっています。この、「文字コードとしての」0から9を、「数字としての」0から9に変えるには、そのズレの分の48、つまり'0'の値を引く必要があります。

投稿2016/02/22 03:24

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norm

2016/02/22 04:25

ご返答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問