В своей книге «Accelerated C» Кениг представляет концепцию использования оператора ' ' для объединения строк литералы и объекты. Хотя это может показаться простым, существуют тонкие нюансы, которые могут привести к неожиданным результатам.
Рассмотрите следующие два примера:
const string hello = "Hello";
const string message = hello ",world" "!";
const string exclam = "!";
const string message = "Hello" ",world" exclam;
В первом примере три строки успешно объединяются. Однако второй пример терпит неудачу.
Чтобы понять несоответствие, мы должны рассмотреть ассоциативность оператора ' '. Оператор '' ассоциативен слева направо, то есть он выполняет вычисления слева направо. Если это не принять во внимание, это может привести к неожиданному поведению.
Во втором примере выражение можно заключить в круглые скобки следующим образом:
const string message = ("Hello" ",world") exclam;
Как видите, сначала объединяются два строковых литерала: "Hello" и ",world". В результате получается строковый литерал, который невозможно в дальнейшем объединить со строковым объектом "exclam".
Решить эту проблему можно несколькими способами:
const string message = string("Hello") ",world" exclam;
const string message = "Hello" (",world" exclam);
Оператор ' ' предназначен для объединения строковых объектов, а не строковых литералов. Строковый литерал представляет собой массив символов, и при использовании в выражении он преобразуется в указатель на его начальный элемент. Добавление двух указателей, как в случае объединения строковых литералов, не допускается в C .
Хотя вы не можете объединять строковые литералы с помощью оператора ' ', вы можете объедините их, поместив рядом:
"Hello" ",world"
Это эквивалентно:
"Hello,world"
Это полезно для разбиения длинных строковых литералов на несколько строк.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3