Почему printf ("% s \ n", "123456789" + 3); // вывод: "456789" - PullRequest
2 голосов
/ 18 апреля 2019

функция выполнения:

printf("%s\n", "123456789" + 3); //output: "456789"

зачем выводить этот результат?Точно так же, что мне делать, если я хочу вывести «123»?Теперь я в замешательстве.Помоги мне.

Ответы [ 4 ]

7 голосов
/ 18 апреля 2019

printf () передается указатель на строковую константу, увеличенную на 3

printf("%s\n", "123456789" + 3);  

printf () принимает строковый аргумент формата, за которым следует переменный набор аргументов.В этом случае '% s' является первой (и единственной) переменной в строке формата.

В разделе переменных есть только один аргумент после строки формата: строковая константа: "12345678", котораяразрешает указатель на символ «1»;однако этот указатель увеличивается на 3 из-за "+ 3".Это перемещает указатель на 3 позиции на «4».

Затем printf печатает строку, начинающуюся с «4».Поскольку строковая константа заканчивается символом «\ 0» сразу после «9», printf печатает «456789»

Печать первых 3 символов строки Для печати только первого3 символа строки, используйте %.3s в строке формата printf:

printf("%.3s\n", "123456789");
1 голос
/ 18 апреля 2019

"123456789" - это строковый литерал .Это объект типа char [10] в C. Это объект типа массива.

Когда объект типа массива используется с двоичным оператором +, он неявно преобразуется (распадается) в указательтип.Результирующее значение указателя указывает на начало массива.Таким образом, исходный массив char [10] затухает до char *, указывая на символ '1' в "123456789".

Двоичный оператор + при применении к указателю выполняет арифметику указателя .Добавление 3 к указателю char * создает указатель, который указывает на 3 байта справа от исходного указателя.Таким образом, вы получаете указатель, который указывает на символ '4' в "123456789".

После этого вы используете формат %s, чтобы попросить printf напечатать строку, начинающуюся с этого '4'.И это вывод, который вы получаете.


То же самое происходит в C ++, за исключением того, что в C ++ этот строковый литерал имеет тип const char [10] и уменьшается до указателя const char *,

1 голос
/ 18 апреля 2019

Нельзя просто добавить строку («123456789») и число (3). Чего ты хочешь? а) Целочисленное сложение или конкатенация строк?

a) 123456789 + 3
b) "123456789" + "3"

Компилятор не будет угадывать, какой вариант вы хотите! Таким образом, один из аргументов необходимо преобразовать в тип другого, используя некоторую функцию, например ( unsafe ) atoi() и т. Д. *

1 голос
/ 18 апреля 2019

По сути, строки являются символьными массивами, то есть их имя (имя переменной) указывает на первый элемент в массиве.Например, в массиве a [] = {3, 4, 5} a [0], очевидно, равно 3. Однако само значение a также равно 3 (например, printf ("% d", * a);)Если вы увеличиваете само себя, вы увеличиваете адрес из a, поэтому значение + 1 будет равно 4. Неявное объявление массива символов (что вы сделали со строкой) по-прежнему требует, чтобы программа далаэто некоторая форма адреса (то есть место, где находится цифра 1 в «123456789»). При этом увеличение самой строки в основном действует так же, как увеличение имени массива, поэтому «123456789» + 3 даст адрес, связанныйс "456789".Так что printf в основном видит «print 456789».

Я сомневаюсь, что смог объяснить это настолько просто, насколько это возможно, или если бы вы могли даже следовать этому, но я попытался.

Лучше всегоудачи!

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