#3
by みけCAT » 6年前
「文字」と「文字列」をしっかり区別しましょう。
exprに入るのは「文字列」です。
expr[i]でそれぞれの「文字」が得られます。
a, s, m, dに入っているのは「文字」です。
「文字列」同士の比較にはstrcmpが使えますが、「文字」同士の比較には直接==演算子などを使うべきです。
「文字」は文字コード(整数)を用いて表され、
数字を表す文字コードは通常その数字とは異なります。
例えば、数字0を表す文字コードは'0'であり、ASCIIなら48です。
従って、文字が数字か判定するには、数値の0や9ではなく文字(コード)の'0'や'9'と比較するべきです。
もしくは、ctype.hを#includeしてisdigit関数を使ってもいいでしょう。
atoiは「文字」ではなく「文字列」から数値へ変換する関数です。
1桁の「文字」から数値に変換するには、その文字コードから'0'を引くといいでしょう。
(C言語では数字0~9の文字コードが連続することが規格で決まっています)
C言語では、演算子「,」はANDではなく、
「左辺を評価した後、その結果を捨てて右辺を評価した結果を返す」演算子です。
C言語の論理AND演算子は「&&」です。
C言語では、「,」や「&&」など一部の演算子を除いて、演算子のどっちの辺を先に評価するかは決まっていません。
従って、「-pop() + pop()」のように1個の式で複数の関数呼び出しを行うと、
意図しない順番で呼び出される可能性があります。
割り算でやっているようにすれば、順番を確定できます。
init関数を呼んでいないので、spはグローバル変数のデフォルト値である0から始まり、
最後に余計な0が出力されるでしょう。
「文字」と「文字列」をしっかり区別しましょう。
exprに入るのは「文字列」です。
expr[i]でそれぞれの「文字」が得られます。
a, s, m, dに入っているのは「文字」です。
「文字列」同士の比較にはstrcmpが使えますが、「文字」同士の比較には直接==演算子などを使うべきです。
「文字」は文字コード(整数)を用いて表され、
数字を表す文字コードは通常その数字とは異なります。
例えば、数字0を表す文字コードは'0'であり、ASCIIなら48です。
従って、文字が数字か判定するには、数値の0や9ではなく文字(コード)の'0'や'9'と比較するべきです。
もしくは、ctype.hを#includeしてisdigit関数を使ってもいいでしょう。
atoiは「文字」ではなく「文字列」から数値へ変換する関数です。
1桁の「文字」から数値に変換するには、その文字コードから'0'を引くといいでしょう。
(C言語では数字0~9の文字コードが連続することが規格で決まっています)
C言語では、演算子「,」はANDではなく、
「左辺を評価した後、その結果を捨てて右辺を評価した結果を返す」演算子です。
C言語の論理AND演算子は「&&」です。
C言語では、「,」や「&&」など一部の演算子を除いて、演算子のどっちの辺を先に評価するかは決まっていません。
従って、「-pop() + pop()」のように1個の式で複数の関数呼び出しを行うと、
意図しない順番で呼び出される可能性があります。
割り算でやっているようにすれば、順番を確定できます。
init関数を呼んでいないので、spはグローバル変数のデフォルト値である0から始まり、
最後に余計な0が出力されるでしょう。