#include <stdio.h>
int main()
{
printf(5 + "Good Morning\n");
return 0;
}
Код печатает Утро. Должен ли код печатать Утро или показывать неопределенное поведение?Поведение printf()
#include <stdio.h>
int main()
{
printf(5 + "Good Morning\n");
return 0;
}
Код печатает Утро. Должен ли код печатать Утро или показывать неопределенное поведение?Поведение printf()
Он должен показывать «Утро».
Вы используете арифметику указателей - хотя вы, похоже, не знаете этого! "Good Morning\n"
является указателем char *
на постоянную строку. Затем вы добавляете 5 к этому указателю, что увеличивает его на 5 символов. Следовательно, указатель теперь указывает на «М» «Утро».
код верен, так как printf
определяется как:
int printf (const char * format, ...);
А по указателям arithmitic 5 + "Good Morning\n"
является указателем на первый элемент "Morning\n"
. Так Постулаты:
printf(5 + "Good Morning\n");
имеет тот же результат, как:
printf("Morning\n");
Пояснение:
|G|o|o|d| |M|o|r|n|i|n|g|\n|
^ ^
| |
"Good Morning\n" >---- |
+ |
5 >----------------------
Это не совсем эквивалентно, поскольку двоичный код будет содержать всю строку. Это может быть значительным, если функция, в отличие от 'printf', возвращена в байты до передачи указателя, а также тот факт, что она тратит пространство в обычных условиях. – abligh
Что заставило вас включить "неопределенное поведение" в качестве возможного сценария? Что конкретно заставило вас подозревать UB в этом коде? – AnT
Ответы здесь уже хорошо объясняют, что происходит, но, как правило, вы должны избегать использования параметра non-constant format для printf, поскольку это затрудняет поиск компилятором ошибок типа. Рассмотрите возможность делать 'printf ("% s "," Доброе утро \ n "+ 5)' вместо – hugomg
Нечетно найти, что это не дублирование многочисленных вопросов. Арифметика указателя кажется редкой. – devnull