2015-01-03 3 views
-2
#include<stdio.h> 
#include<stdlib.h> 
void main() 
{ 
int c = 1; 
printf("%d" + 0 , c); 
printf("%d" + 1 , c); 
printf("%d" + 2 , c); 
printf("%d" + 3 , c); 
} 

Выход следующей программы:Использование "% D" + константа в функции PRINTF

1d

Может кто-нибудь, пожалуйста, объясните почему?

+2

Посмотрите на строковые литералы и арифметику указателей. – juanchopanza

ответ

3

при кодировании "literalstring" + 3 вы получите 4 й (с 4 = 3 + 1 и массивы начинаются индекса в 0) и следующих байтах "literalstring" (который завершается нулевой байт), так что вы получите "eralstring", следовательно,

  • "%d" + 0 является "%d"
  • "%d" + 1 является "d", обратите внимание, что printf("d", 1)игнорирует аргумент 1!
  • "%d" + 2 является "" пустой строкой
  • "%d" + 3 указует на неопределенное место и разыменованиях его (как printf вероятно, делает) является undefined behavior ...
+0

И ''% d "+ 3' - неопределенное поведение. – juanchopanza

+1

Я бы сказал, что разыменование ''% d "+ 3' является неопределенным поведением –

+0

Правильно, я принял' printf' de-ссылки. – juanchopanza

1
printf("%d" + 0 , c); 

таким же, как

printf("%d", c); 

Что печатает значение c, то есть 1.

printf("%d" + 1 , c) 

такое же, как

printf("d", c) 

, который печатает "D" на экране. Lthird printf похож на

printf("", c) 

, который ничего не печатает, а последний вызывает UB (Undefined Bahaviour)

1

Вы перемещаете указатель "%d", который передается в printf так

  1. printf("%d" + 0, c)

    printf("%d", c); 
    /* prints the value of c */ 
    
  2. printf("%d" + 1, c)

    printf("d", c); 
    /* prints 'd' */ 
    
  3. printf("%d" + 2, c)

    printf("", c); 
    /* the format string is empty nothing printed */ 
    
  4. printf("%d" + 3, c) Здесь Printf получите адрес, который указывает мимо буфера, это неопределенное поведение.

И наконец

1d 

печатается.

Возможно, что при printf("%d" + 3, c) сигнал ошибки сегментации будет получен вашим программным обеспечением, 1d будет по-прежнему распечатываться, если stdout сбрасывается до отказа сегментации.

2

Для этого ниже одного вы получите результат, как

printf("%d\n" + 0 , c); -> 1 // +0 so Value of c will came 
printf("%d\n" + 1 ,c); -> d // +1 "d" will print. 
printf("%da\n" + 2 , c); -> a // +2 second character "a" will print 
printf("%dab\n" + 3 , c);-> b // +3 third character "b" will print 

Так он получает символы из данной строки.

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