C の文字列と数値の予期しない連結 : "456" の探索 1
コード スニペット
< pre>#include
int main()
{
std::cout << "25"+1; return 0;
}
は、なぜそうなるのかという複雑な疑問を投げかけます。式 "25" 1 は、予期される "26" ではなく "5" を出力しますか?この謎を解明するために、このコードの内部の仕組みを詳しく調べてみましょう。
C では、 "25" のような文字列リテラルは真の文字列としてではなく、文字配列として扱われます。示されている例では、「25」は文字配列 {'2', '5', ' '} に相当します。ここで、' ' は文字列の終わりを示すヌル終端文字です。
When明示的なキャストを行わずに配列が式で使用されると、配列は自動的に最初の要素へのポインタに減衰します。したがって、「25」は事実上 &"25"[0] (文字 '2' へのポインター) に減衰します。このポインタに 1 を加えると、次の文字 ('5') を指すようにインクリメントされます。
std::cout の型である std::ostream の動作を考慮すると、プロットはさらに濃くなります。このクラスは、char と const char (char* が減衰するもの) の両方を受け入れ、それらを null で終わる文字列として解釈できます。したがって、&"25"[0] を受け取ると、ヌル終端文字に遭遇するまでそのポインターから文字を出力し、その結果、出力として "5" が表示されます。
以上がC で「25」 1 が「5」を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。