#include<stdio.h>
int main()
{
char *p;
p="%d\n";
p++;
p++;
printf(p-2, 400);
return 0;
}
Когда я запускаю код выше, я получаю вывод 400. Но почему 400?Какой будет выход следующей программы C
#include<stdio.h>
int main()
{
char *p;
p="%d\n";
p++;
p++;
printf(p-2, 400);
return 0;
}
Когда я запускаю код выше, я получаю вывод 400. Но почему 400?Какой будет выход следующей программы C
printf()
Первый параметр - это строка формата. Переменная p
является указателем на массив символов, который также представлен в виде строк.
Когда p присваивается строка "%d\n"
, она указывает формат целого числа, чтобы напечатать его значение, а затем напечатать символ возврата каретки.
С p
является указателем на символ p++
означает перемещение указателя вперед 1 символ. Это делается дважды, чтобы переместить p
вперед 2 символа, чтобы он указывал на начало символа возврата каретки. p-2
говорит, что делает указатель математике, чтобы дать char*
2 символа перед тем, где p
баллов.
Это начало строки возврата каретки %d
. Это становится строкой формата, а второй параметр 400 заменяет %d
и печатает сам, за которым следует возврат каретки.
p
сначала назначается строка форматирования. Затем он уменьшается на 1 два раза. Наконец, его значение минус два передается в printf с дополнительным параметром 400.
Вычитание 2 из последнего значения p
возвращает его к исходной строке форматирования. И поэтому printf печатает значение 400.
Спасибо @Zbynek. Я понял. –
Вы указали указатель на строку и присвоили ей значение "%d\n"
. Этот указатель содержит адрес в памяти.
Например, позволяет сказать, что он указывает на адрес 6 при добавлении к нему два (которые вы не должны делать вам, что вы всегда должны знать, где ваши указатели указывают), вы измените адрес до 8.
Теперь, когда вы делаете printf
, вы заменяете его на текущее значение адреса p
указывает на (8) минус 2, который равен 6.
Что еще вы ожидали получить и почему? –
На самом деле я больше не знал о синтаксисе функции printf(). Поэтому я не понимаю, что происходит в моем коде. –