2014-01-22 6 views
4
#include <stdio.h> 

int main() 
{ 

    printf(5 + "Good Morning\n"); 

    return 0; 
} 

Код печатает Утро. Должен ли код печатать Утро или показывать неопределенное поведение?Поведение printf()

+0

Что заставило вас включить "неопределенное поведение" в качестве возможного сценария? Что конкретно заставило вас подозревать UB в этом коде? – AnT

+1

Ответы здесь уже хорошо объясняют, что происходит, но, как правило, вы должны избегать использования параметра non-constant format для printf, поскольку это затрудняет поиск компилятором ошибок типа. Рассмотрите возможность делать 'printf ("% s "," Доброе утро \ n "+ 5)' вместо – hugomg

+0

Нечетно найти, что это не дублирование многочисленных вопросов. Арифметика указателя кажется редкой. – devnull

ответ

10

Он должен показывать «Утро».

Вы используете арифметику указателей - хотя вы, похоже, не знаете этого! "Good Morning\n" является указателем char * на постоянную строку. Затем вы добавляете 5 к этому указателю, что увеличивает его на 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 >---------------------- 
+1

Это не совсем эквивалентно, поскольку двоичный код будет содержать всю строку. Это может быть значительным, если функция, в отличие от 'printf', возвращена в байты до передачи указателя, а также тот факт, что она тратит пространство в обычных условиях. – abligh

Смежные вопросы