2012-03-30 2 views
-1

Можно создать дубликат:
Undefined Behavior and Sequence Points
How the statement x=x++ + y++; executes to the value 3?как функция printf работает?

Мне было интересно, как Printf работа в случае, как это:

int i = 0; 
printf("%4d%4d", i++, i); 

Результат 0 1

в другом случае

int i = 0; 
printf("%4d%4d", i, i++); 

Результат 1 0

+2

Использование я ++ и я в одном операторе не определено поведение. Он может печатать что угодно. См. Http://stackoverflow.com/q/4401104/79455 – rve

+1

Вы имеете в виду, как i ++ работает в случаях. – RvdK

+1

@rve: Использование 'i ++' и 'i' в одном выражении * может * быть в порядке; проблема заключается в том, когда они оцениваются без промежуточной точки последовательности. –

ответ

2

Это не имеет ничего общего с Printf, и все, что связано с порядком, в котором оцениваются параметры и пути компилятор выполняет код. Поведение не определено, и результаты будут зависеть от вашего компилятора, вызывающего соглашения и фазы луны.

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

Важно отметить, что i++ не означает (как это обычно преподается) «приращение I после выполнения этой строки », это просто означает« приращение i в какой-то момент после предоставления мне его значения и перед выполнением следующей строки ». Это очень много возможностей для компилятора, чтобы сделать то, что официально называется «неопределенным поведением».

Как отмечает @Als в комментарии, вам удалось объединить как неопределенные, так и неуказанные поведения в одной строке кода.

+0

Порядок оценки аргументов функции не указан. При изменении переменной более одного раза без промежуточной точки последовательности является Undefeind Behavior. –

1

Это не из-за PRINTF это из-за вас, чтобы быть в случае непредсказуемое поведение

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