2012-05-21 3 views
-1

Можно создать дубликат:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)Неоднозначность в ответ на C

Я слышал эту функцию выполняет PRINTF справа налево и печатает слева направо. По этой конвенции следующая программа должна дать 7,6,5. Но это дает 7,7,7 на моем компиляторе Linux gcc. Является ли он зависимым от компилятора?

int i=5; 
printf("%d %d %d\n",++i,++i,i); 

Кроме того, мы можем использовать Cdecl/паскаль ключевое слово, чтобы изменить порядок исполнения Printf? Если да, как мы это делаем? Я пытался сделать это, но безуспешно. Thanx заранее!

+3

Вы слышали неправильно. Это неопределенное поведение. – Dave

+0

Нет порядка выполнения 'printf'.' Printf' - это одна функция, и она выполняется один раз в вашем коде. – geoffspear

ответ

1

Порядок оценки в вашем коде не определен, так как нет точек последовательности. Вы не можете ретранслировать порядок оценки аргументов функции, и вы также не можете его изменить.

http://www2.research.att.com/~bs/bs_faq2.html#evaluation-order

+0

возможно потому, что я использую приращение на переменную sam без последовательности, но если мы будем использовать переменные differnt, будет ли порядок оценки таким, как я написал? – Ashwyn

+0

@Ashwyn : Нет, вы можете думать о порядке оценки как «абсолютно случайный». –

1

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

+0

В частности, если у вас есть побочные эффекты, которые влияют на другие параметры. '++ i' определяется как поведение поскольку нет других параметров, оценка которых зависит от 'i'. –

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