какая разница в типе между массивом char и строковым литералом - PullRequest
0 голосов
/ 07 октября 2019

Я читаю книгу по языку программирования C ++ и изучаю указатель на символ,
я нашел этот код char s[] = "Gorm";
, который напоминает мне, что строковый литерал неявно преобразуется в const char *.

, поэтому я смутился, что lhs и rhs не одного типа.

я использовал онлайн-компилятор и код отсюда: Можно ли напечатать тип переменной в стандарте C ++?
, чтобы получить представление о том, как компилятор видит тип lhs и rhs,
тогда я обнаружил, что lhs рассматривается как char[5], тогда как rhs рассматривается как char[5] const &
я могу интерпретировать lhs,
, но я не могу понять, что такое "постоянная ссылка lvalue на массив из 5 символов" или
даже после неявного преобразования lhs char s[] в char* s,
что такое "постоянная ссылка lvalue на неконстантный указатель на неконстантный символ" ??

не является lvalue-ссылкой по определению константы "это относится только к значению, инициализирующему его" ???
так зачем нам нужен const перед "&" ???

и как можно назначить lhs и rhs разных типов ??????

предложенный ответ действительно полезен для понимания того, как char s [] инициализируется из строкового литерала "itэто правило языка ".

но это не отвечает на часть вопроса относительно выражения "char [5] const &" ???

что означает const & в этом странном выражении? !!!
что означает const ???

относится ли это к самой ссылке на lvalue ??? "ссылка является постоянной по определению, и мы не можем изменить значение ссылки после инициализации" ???

или это относится к элементу массива const char, так что строковый литерал массива не может изменить ????
, но в этом случае const должен быть поставлен перед char илипосле char не раньше & ????? !!!

или const относится к типу char[5], и в этом случае какова его важность?
обычно массив не может быть изменен относительно размера или типа после определения ??

1 Ответ

0 голосов
/ 07 октября 2019

Хотя ваш вопрос неясен, я считаю, что основная проблема заключается в том, что строковый литерал имеет тип, отличный от массива char char[]. Строковый литерал не является строкой или массивом char, которые являются типом данных в c ++, но представляет собой синтаксическую структуру, которая определяется во время компиляции. Другим примером может быть целочисленный литерал 0b00000101, который представляет целое число, равное 5, но не является целым числом, точно так же, как "gorm" не является строкой, но представляет строку (точнее, массив символов) для компилятора. Когда вы объявляете массив символов и инициализируете его строковым литералом, как вы делаете здесь: char s[] = "Gorm";. Это говорит компилятору обрабатывать строковый литерал как массив символов при инициализации массива символов s.

Я считаю, что было бы полезно изучить концепцию литерала и то, как он помогает при инициализации значений в языке программирования. Ссылка на страницу Википедии о литералах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...