- ベストアンサー
文字列リテラルの比較について
下記のプログラムの疑問点を教えて頂きたい。 (1)mainの実引数(ch[0]は、str_chr関数を呼ぶ場合、intの型変更する理由、 (2)cをキヤストしてchar 型変更した後、再度int C に代入する理由 (3)char型*Sとint 型Cでは、型が違うのに何故比較できる理由 char *str_chr(const char *s, int c) { c = (char)c; while (*s != c) { } main { char ch[2]; str_chr(G,ch[0]) main {
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
仮にCPUが32ビット長だとします。 スタックにデータを入れる(PUSH命令)、取り出す(POP命令)は 1命令で4バイトの出し入れを行います。例え、データとして8ビット しかなくても、同様です。(この場合、3バイトは無駄になります) もし、パラメータがint(32ビット)なら、スタックから1発で内容を 取得でき、そのままの形で比較などに使えます。 これがchar(8ビット)ですと、データを取得してから下位8ビットを 残すため、0xFFと論理積(AND)をとる必要が生じます。 最適化をしない、あるいはこういった仕様に無頓着なコーディング ですと、このパラメータを扱う度に余計なコードが発生して効率が 悪くなります。これはshort(16ビット)でも同じことが言えます。 >自動的に昇格されint型変更される 関数の定義がintになっているので、呼び出し側がこれに合わせようと しているだけです。当然の処置と言えます。もし、関数の定義がchar なら、このようなことは行われません。 実際には最適化が働くし、ベースポインタを使うスタック操作なので、 極端な性能劣化はありません。ただ、昔気質のジジイSEとしては こういう所に神経が通ってないと、イラつくのは確かですが…
その他の回答 (4)
- nda23
- ベストアンサー率54% (777/1415)
(1)mainの実引数(ch[0]は、str_chr関数を呼ぶ場合、intの型変更する理由、 数値なので、int、short、long、charのどれでも良いのです。 パラメータはスタック経由で渡されるので、スタック1回の操作で 扱う量=マシンのビット長=int型とするほうが合理的だからでしょう。 (2)cをキヤストしてchar 型変更した後、再度int C に代入する理由 理由は不明ですが、2バイト文字(漢字など)を許さないようにして いるためと推察します。charもintも符号付整数なので、自動的に符号 拡張が行われます。 (3)char型*Sとint 型Cでは、型が違うのに何故比較できる理由 だから、数値としての比較なんですよ。「1000と10でなぜ比較できる」 というレベルの話です。桁数が違うだけで、数値は数値です。 charもintもビット長が違うだけで、符号付整数です。
補足
回答ありがとうごさいます。(2)(3)は、わかりました、 (1)は、わかりましたが、ある本の説明をみると実引数がcharで、関数を呼ぶと 自動的に昇格されint型変更されるためと書かれているので、仮引数をintと設定するのは、間違いでしょうか
- trapezium
- ベストアンサー率62% (276/442)
>c = (char)c;とする理由 ですが、要はc &= 0xffとしたかったのだと思いますよ。cはintですからcharで許される以上の上位ビットをクリアしたかったのでしょう。 1と3は自動的にcastされると考えてください。
補足
回答ありがとうこざいます、c = (char)c;とする理由は、上位ビットをクリアすることがわかりました。
- php504
- ベストアンサー率42% (926/2160)
str_chrの第2引数がintなのは標準関数のstrchr( )にあわせたのでしょう c = (char)c; はわかりにくいですね 普通に char ch = c; while (*s != ch) のほうが見やすいと思います。 整数同士は型が違っても比較できます。
補足
回答ありがとうございます。整数同士は型が違っても比較できることかわかりましたが、なぜc = (char)c;とする理由を教えて頂きたい。また、疑問点(1)(2)(3)の回答をお願いします。
- nda23
- ベストアンサー率54% (777/1415)
文字は文字コードだということをご存知ですか? ある1バイトのメモリに0xB1という値が入っていた時、+177ととるか、 -79ととるか、"ア"(実際は半角カナ)ととるかはプログラマの自由 です。 str_chrは第2パラメータの文字(コード)を探すので、数値なのです。 故に1文字に限定すれば数値としての比較でしかありません。 int=数値、char=文字 と思っているなら、間違いです。どちらも 数値で、前者はマシンのビット長(大方は32)、後者は8ビットの 長さというだけで、符号付数値データに変わりはありません。
補足
回答ありがとうございます。長さの違いでデータの内容は、同じとわかりましたが 疑問点(1)(2)(3)の理由を教えて頂きたい。
補足
回答ありがとうございます。よくわかりました、私もジジなので今後もよろしくお願いします。