2014-01-16 2 views
-3
#include <stdio.h> 

int main() 
{ 
    short int a = 5; 
    printf("%d" + 1, a); 
    return 0; 
} 

код печатает алфавит, заключенный в кавычки в printf, независимо от величины и типа переменной a. Если добавляется любое другое число, за исключением 1, ничего не печатается. Почему это так?Неожиданное поведение Е() в C

+2

Игнорировать 'printf'. Что означает строка "+ 1"? – librik

+2

Что именно вы ожидаете от печати? – mikea

ответ

5

Не уверен, я ожидаю, что он будет печатать только d, конечно. Вот что случилось, когда я его протестировал.

Если вы добавите более 1 (или 2), все ставки отключены, и вы получаете неопределенное поведение для передачи случайного указателя вместо допустимой строки форматирования.

+0

Зачем ему печатать d в первую очередь? – user3202188

+5

@ user3202188 Поскольку строка формата, которую вы передаете, запускает один символ за начало строки ''% d '', которая является строкой' 'd''. Основная арифметика указателя. – unwind

+0

Когда вы добавили NUMBER в STRING, вы получите новую строку, которая запустит это число символов перед началом исходной строки. Это конкретный пример более общего принципа C «арифметики указателя». – librik

3

На компиляции приведенного выше кода, вы должны получить предупреждение, как:

[Warning] too many arguments for format [-Wformat-extra-args] 

Теперь удалите printf сек аргумент a.

printf("%d" + 1); 

Это будет печать d.

100 101 
% d 
^ 
| 
Here is the starting address of the string. 

%d является строкой и ее начальный адрес 100. "%d" + 1 даст вам адрес 101.

+0

Я не вижу никакого очевидного UB - просто указателя арифметики (как ответил разворот). Можете ли вы привести стандарт, в котором UB находится в этой программе? –

+1

Downvoter wait. Я даю вам ссылку. – haccks

+2

(У меня нет ни слова) - Я не думаю, что это UB. Va_start/va_end должен вести себя отлично для «неправильного количества аргументов».Конечно - это будет проигнорировано, но я не вижу никакого профессора, это UB. Предупреждение противоречит потенциальной ошибке (похоже на одно на 'if (x = y)'), я полагаю. Возможно, я ошибаюсь. –

1

Почему вы хотите это сделать? если вы хотите, вы можете сделать как сделать как

  printf("%d", a+1); 
1

Попробуйте, и вы поймете, что UNWIND пытается заставить вас понять

#include <stdio.h> 

int main() 
{ 
    short int a = 5,b = 4; 
    printf("%d %d" + 4, a,b); 
    return 0; 
} 

ВЫВОД: d

Поскольку требуется 4-й символ внутри двойных кавычек в заявлении printf().

Если номер 3

ВЫХОД: 5

Если число равно 2

ВЫХОД: 5

Если число равно 1

ВЫХОД: д

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