Сегодня я прочитал в "C Traps and Pitfalls" о""и''описании,''Символ в одинарных кавычках представляет целое число, и значение этого целого числа соответствует порядковому значению этого символа в наборе символов, используемом компилятором.
""Строка в двойных кавычках представляет указатель на первый символ безымянного массива. Я заинтересовался этими двумя символами, поэтому открыл VS2010, чтобы посмотреть, как символы в одинарных и двойных кавычках хранятся в памяти.
Метод эксперимента очень прост: отдельно просмотреть"yes"/'yes'/'ye'/'y'формы хранения четырёх типов символов в памяти, код выглядит следующим образом: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;
}
Результаты эксперимента следующие:

Согласно формам хранения в памяти, было обнаружено, что''Символ в одинарных кавычках в форме хранения целого числа рассматривает первый символ как старший байт, а последний символ — как младший байт, и сохраняет их в этом порядке в 4-байтовое пространство хранения переменной типа int;
""Строка в двойных кавычках сохраняет первый символ по начальному адресу, а последний символ — по конечному адресу.
Результаты эксперимента подтвердили описание в "C Traps and Pitfalls". Тогда что произойдёт, когда''символ в одинарных кавычках превышает44 байта? Был проведён ещё один эксперимент, и код выглядит следующим образом:
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, он принимается как есть без каких-либо предупреждений, что создаёт скрытую опасность неправильного использования символов, и отладка будет довольно проблематичной, если в программе позже возникнут проблемы.
Исходный URL: https://blog.csdn.net/u013541620/article/details/43172891