今日、『Cの罠と落とし穴』の中で""と''についての説明を見て、''クォートされた1つの文字は整数を表し、その整数値はコンパイラが採用する文字セットにおけるその文字の序列値に対応する。
""クォートされた文字列は、名前のない配列の先頭文字を指すポインタを表す。この2つの記号に興味を持ち、VS2010を開いて、シングルクォートとダブルクォートで囲まれた文字のメモリ上の格納形式を確認した。
実験方法は非常に簡単で、それぞれ"yes"/'yes'/'ye'/'y'4種類の文字のメモリ上の格納形式を確認する。コードは次のとおりである。int _tmain(int argc, _TCHAR* argv[])
{
char test1[] = "yes";
int test2 = 'yes';
printf("%x\n", &test2);
int test3 = 'ye';
printf("%x\n", &test3);
int test4 = 'y';
printf("%x\n", &test4);
return 0;
}
実験結果は次のとおりである。

メモリ上の格納形式によると、''クォートされた文字列は整数の格納形式に従い、最初の文字を最上位バイト、最後の文字を最下位バイトとして認識し、この順序でint変数の4バイトの格納領域に格納される。
""クォートされた変数は、最初の文字が開始アドレスに格納され、最後の文字が終了アドレスに格納される。
実験の結果は『Cの罠と落とし穴』の説明を裏付けた。では、''クォートされた文字が4バイトを超えるとどうなるだろうか?もう一度実験を行う。コードは次のとおりである。
int _tmain(int argc, _TCHAR* argv[])
{
char test1[] = "yes";
int test2 = 'yes';
printf("%x\n", &test2);
int test3 = 'ye';
printf("%x\n", &test3);
int test4 = 'y';
printf("%x\n", &test4);
int test5 = 'yesa';
printf("%x\n", &test5);
return 0;
}
実験結果は次のとおりである。

実験結果から、文字が4バイトを超えるとint型の格納能力を超えるため、コンパイラがエラーを報告し、定数文字が多すぎるというメッセージを表示することがわかる。これにより、プログラマーの皆さんに記号の入力ミスの可能性を効果的に警告できる。しかし、int型の格納能力を超えない場合は何の警告もなくそのまま受け入れられてしまうため、記号の誤用という潜在的な危険が存在し、今後プログラムに問題が発生した場合のデバッグはかなり面倒になる。
原文アドレス:https://blog.csdn.net/u013541620/article/details/43172891