Возникли проблемы с выводом оператора printf - PullRequest
1 голос
/ 02 июля 2019

У меня возникли проблемы с пониманием вывода следующего фрагмента кода.

#include<stdio.h>
int main()
{
    char *str;
    str = "%d\n";
    str++;
    str++;
    printf(str-2, 300);
    return 0;
}

Вывод кода 300.

Я понимаю, что до строки перед printf оператор str указывает на символ %.Мне нужна помощь в понимании того, почему функция printf печатает 300.

Ответы [ 2 ]

5 голосов
/ 02 июля 2019

Прямо перед printf, str означает не , указывающее на %, а на \n.

Оператор ++ увеличивает значение str, чтобы оно указывало на следующий символ в массиве.Поскольку это делается дважды, это указывает на \n.Когда вы затем передаете str-2 на printf, он создает указатель, указывающий обратно на %.Так что printf видит строку "%d\n", которая приводит к печати 300, как и ожидалось.

3 голосов
/ 02 июля 2019

2 - 2 равно 0 .:)

Фактически эти два выражения

str++;
str++;

могут быть переписаны как

str = str + 1;
str = str + 1;

эквивалентны одному выражению

str = str + 2;

Тогда в выражении с printf

printf(str-2, 300);

вы используете выражение str-2, которое указывает на первый символ строкового литерала "%d\n"Или значение выражения str-2 равно исходному значению str.

(Вы помните, что 2 - 2 == 0?)

Таким образом, приведенное выше утверждение эквивалентно

printf(str, 300);

, когда str был изначально инициализирован строковым литералом "%d\n"

...