2014-10-15 3 views
-1

Сегодня я пересматривал Pre Increment and Post Increment.Pre Increment & Post Increment

Основные определения, которые я знаю.

Pre Increment - Увеличивает значение и возвращает значение.

Post Increment - Увеличивает значение и возвращает значение до приращения.

Но, выполняя некоторые комбинации из них, я в тупике.

Используя базовую программу C, вот что я тестировал.

С i = 0 изначально.

первый тест

printf("%d %d",++i,++i); 

Ouput:

2 2 

I Ожидаемое:

1 2 

второго испытания

printf("%d %d",i++,i++); 

Ouput:

1 0 

I Ожидаемое:

0 1 

третьего испытания

printf("%d %d",i++,++i); 

Ouput:

1 2 

I Ожидаемое:

0 2 

четвёртую Тест

printf("%d %d",++i,i++); 

Ouput:

2 0 

I ОЖИДАЕТСЯ:

1 1 

Я понял, что оценка может быть с правой или с левой стороны. Может быть, слева в случае предварительного приращения & Право в случае приращения сообщения. Возможно, Pre Increment имел более высокий приоритет, чем приращение Post. Некоторые идеи соответствуют результатам, но предположение, сделанное на одном тесте, не объясняет другой результат.

+3

Все неопределенное поведение. – chris

+1

Для C, связанных с [Почему эти конструкции не определены?] (Http://stackoverflow.com/q/949433/1708801) и [Является результатом printf («% d% d», C++, c); также undefined?] (http://stackoverflow.com/q/10845122/1708801) –

+0

Измените свои тесты на что-то вроде 'int before = i ++; printf ("% d% d \ n", before, i); 'чтобы избавиться от неопределенного поведения. – 5gon12eder

ответ

6

Все, что у вас есть, - это неопределенное поведение, поскольку вы изменяете одну и ту же переменную несколько раз между одной и той же парой точек последовательности.Например,

i = i++; 

также не определено. Там более глубокое обсуждение here, и есть хороший slideshare, который покрывает это и более «глубокие C» причуды.

Другой вопрос - это порядок оценки. Аргументы оцениваются в произвольном порядке, так что если у вас есть

f(a(), b(), c()); 

можно назвать a, b и c в любом порядке.

Вы смешиваете неопределенное поведение и неуказанное поведение, поэтому, хотя вы можете рискнуть объяснить, почему вы получаете результат, который вы делаете, трудно дать удовлетворительное объяснение, так как оно настолько случайное.

+0

Я вижу, я не знал, что это неопределенное поведение. Но в университете я столкнулся с много раз такими проблемами, как - int b = i ++ + ++ i и т. Д. Итак, эти вопросы не являются действительными вопросами вообще? –

+0

@ShauryaChaudhuri Действительно, они не являются действительными вопросами вообще (в C, в Java порядок оценки строго определен) ... если только они не являются тестовыми вопросами, которые отслеживают ход работы, объясняя, что они не определены. –

+0

@ShauryaChaudhuri Я видел такие вопросы, как, где говорится: «Каковы возможные значения b?» или что-то подобное, ответ заключается в том, что это может быть что угодно. программа может потерпеть крах, ваш компьютер может загореться, что угодно. Тем не менее, многие профессора не беспокоятся о таких деталях низкого уровня, поэтому будьте готовы вытащить стандарт C, если вы хотите показать, что вы правы. –