toupper() および to lower() を呼び出すとき: unsigned char にキャストする
一方、Stack Overflow で評判の高いコメント投稿者は char をキャストすることを提案しています。 toupper または to lower を呼び出す前に unsigned char に引数を渡す必要がありますが、この必要性は、によって明示的に言及されていません。 Bjarne Stroustrup 著「C プログラミング言語」この意見の違いにより、次のような疑問が生じます。そのようなキャストは必要ですか、それとも見落としなのでしょうか?
型と表現
char、signed char、unsigned char は別のものです種類。 char は通常、符号付き表現または符号なし表現のいずれかを表しますが、toupper 関数には unsigned char として表現できる int 引数が必要です。引数が表現可能でない、または EOF に等しい場合、未定義の動作が発生します。
未定義の動作
プレーン char が signed 型であると仮定します。 name[0] が負の値を示す場合、toupper(name[0]) を使用すると未定義の動作が発生する危険があります。ただし、Stroustrup が提供する例では、初期化によって負でない値が保証されます。
不要な変換
にもかかわらず、char を (unsigned)char に変換しても解決されません。暗黙的な原因により、依然として負の int 値が発生する可能性があるため、問題が発生します。
実際的な考慮事項
toupper は負の値を処理するために実装できますが、必須ではありません。さらに、これらの関数は EOF (-1) に等しい引数を受け入れる必要があり、通常は負の値です。
結論
EOF を受け入れるにもかかわらず、toupper は未定義の動作を防ぐために、入力文字を unsigned char として表現できるようにします。 Stroustrup の例はキャストの必要性を示していないかもしれませんが、移植性と正しい機能を確保するために、特に否定文字や特殊文字を扱う場合には、キャストすることをお勧めします。
以上が`toupper()` と `to lower()` へ: `unsigned char` にキャストする必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。