こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c言語 プログラミング

以下のプログラムで分からないところがあります。


数式をxpyの形式で入力して、(x,y:整数、p:x,-,*,/のいずれかの演算記号)
答えを表示するというプログラムなのですが、
5行目と9行目にある”-'0'”の意味が分からないので教えてください。

01: int x=0,y=0,z,i;char a[30],p;
02: printf("式を入力してください。:);gets(a);
03: for(i=0;a[i];i++)
04:  if('0'<=a[i] && a[i]<='9')
05:   x=10*x+a[i]-'0';
06:  else{p=a[i]-'0';break;}
07: for(i++;a[i];i++)
08:  if('0'<=a[i] && a[i]<='9')
09:   y=10*y+a[i]-'0';
010: switch(p){
11:  case '+':z=x+y;break;
12:  case '-':z=x+y;break;
13:  case '*':z=x*y;break;
14:  case '/':z=x/y;break;
15:  default:puts("入力エラーです。");return 0;
16: }
17: printf("%d%c%d=%d\n",x,p,y,z);

よろしくお願いします。(読みにくかったらメモ帳などにコピペしてください)

投稿日時 - 2007-05-24 08:51:09

QNo.3025817

暇なときに回答ください

質問者が選んだベストアンサー

”-'0'”
これは、C言語においては、「文字を数値化する」というテクニックとしてよく使われるものです。

細かいことをいえば、C言語の char は、文字コードを保持します。
例えば、a[0] = '1';
の時、a[0] の値は、('1' ですが) 49 という数値でもあります。
これは、'1' の文字コードが、(よく使われる例では) 49 だというだけのことです。

同じように、文字コードを調べると
'0' -> 0x30(16進数表示) -> 48 (10進数表示)
'1' -> 0x31 -> 49
'2' -> 0x32 -> 50
'3' -> 0x33 -> 51
...
'9' -> 0x39 -> 57
です。
数値として計算する時には、この文字コードを、数値に直す必要があります。つまり、'3' なら、51 という文字コード(の数値)ではなく、3 という数値として扱いたいわけです。
これは、51 - 48 = 3 と、48 を引くことで実現できます。
つまり、'0' の文字コードを引けば良いわけです。
これを表現したのが、 - '0' という表示です。

さて、元のプログラムの、06 行目間おそらく間違っています。
ここは、- '0' してはなりません。

投稿日時 - 2007-05-24 09:22:39

お礼

詳しく説明していただいてありがとうございます。
よく理解できました。

06行目間違ってますね。^^;

投稿日時 - 2007-05-24 10:58:05

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>5行目と9行目にある”-'0'”の意味が分からないので教えてください。

文字から整数値を得るための変換式です。
「0」の文字コードは48(10進)です。
「1」なら49(10進)。
a[i]='1' なら、
x = 10 * x + 49 - 48
なので、結果として
x = 10 * x + 1
になります。

投稿日時 - 2007-05-24 09:22:40

お礼

説明していただいてありがとうございました。

これからもC言語の勉強に励みます。。

投稿日時 - 2007-05-24 10:59:43

あなたにオススメの質問