• ベストアンサー

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); よろしくお願いします。(読みにくかったらメモ帳などにコピペしてください)

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

  • ベストアンサー
回答No.1

”-'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' してはなりません。

goopth
質問者

お礼

詳しく説明していただいてありがとうございます。 よく理解できました。 06行目間違ってますね。^^;

その他の回答 (1)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>5行目と9行目にある”-'0'”の意味が分からないので教えてください。 文字から整数値を得るための変換式です。 「0」の文字コードは48(10進)です。 「1」なら49(10進)。 a[i]='1' なら、 x = 10 * x + 49 - 48 なので、結果として x = 10 * x + 1 になります。

goopth
質問者

お礼

説明していただいてありがとうございました。 これからもC言語の勉強に励みます。。

関連するQ&A