Подтвердить что ты не робот

Почему в коде "456" +1 выход составляет "56",

#include <iostream>
int main()
{
    std::cout << "25"+1;
    return 0;
}

Я получаю "5" в качестве вывода. когда я использую "5" + 1, вывод пуст, "456" +1 выход - "56". путают то, что происходит за кулисами.

4b9b3361

Ответ 1

Строковый литерал "25" действительно представляет собой массив char типа const char[3] со значениями {'2', '5', '\0'} (два символа, которые вы видите, и нуль-терминатор.) В C и С++ массивы могут легко распадаться на указатели к их первому элементу. Вот что происходит в этом выражении:

"25" + 1

где "25" распадается на &"25"[0] или указатель на первый символ. Добавление 1 к этому дает указатель на 5.

Кроме того, std::ostream, из которых std::cout является экземпляром, печатает a const char* (обратите внимание, что char* также будет работать), предположив, что это строка с завершающим нулем. Поэтому в этом случае он печатает только 5.

Ответ 2

За кулисами "25" представляет собой массив из трех символов: два, представляющие '2' и '5', и терминатор со значением нуля, чтобы отметить конец.

Массив - это немного странное существо с тенденцией к изменению в указатель (к первому элементу), если вы что-то делаете с ним. То, что происходит здесь: добавление одного в массив не имеет смысла, поэтому оно превращается в указатель. Добавление одного к нему дает указатель на второй символ.

При указании символа символ << предполагает, что он указывает на завершенную строку и сохраняет символы печати до тех пор, пока не найдет терминатор (или каким-то образом не взорвется, если его нет). Поэтому, указав указатель на второй символ строки, вы будете печатать все символы со второго и второго, как вы заметили.

Если вы новичок в C и С++, сначала вы должны решить, на каком языке учиться, так как они очень разные. Если вы выберете С++, вам будет полезно познакомиться с его дружелюбной высокоуровневой библиотекой (например, std::string для работы со строками без этой странности), прежде чем погрузиться в безумство уровней и указателей низкого уровня.

Ответ 3

Когда вы пишете ", компилятор понимает, что вы вставляете строку внутри. В этом случае вы используете функцию cout, поэтому она выводит на экран эту строку. Вы работаете со строками при использовании оператора" +", поэтому выполняете операцию смещения перед отправкой в ​​cout.