2016-04-15 3 views
-3

Прежде всего, я хотел бы извиниться, если этот вопрос задан ранее на этом форуме. Я искал, но не мог найти подобную проблему.pre-increment и post-increment in C

Я новичок в C. Я проходил учебное пособие и натолкнулся на код, решение которого я не могу понять.

Вот код -

#include <stdio.h> 
#define PRODUCT(x) (x*x) 

int main() 
{ 
    int i=3, j, k; 

    j = PRODUCT(i++); 
    k = PRODUCT(++i); 

    return 1; 
} 

Я попытался запустить код через компилятор и получил решение как «J = 12» и «к = 49».

Я знаю, как работает #define. Он заменяет каждое появление PRODUCT (x) на (x * x), но я не могу понять, как j и k получили значения 12 и 49 соответственно.

Любая помощь будет оценена по достоинству.

Спасибо за ваше время.

+0

NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO! –

+1

«Я искал, но не нашел подобной проблемы». ДЕЙСТВИТЕЛЬНО? –

+1

«Я не могу понять, как j и k получил значения» - и ваш код не может быть, так что вы в хорошей компании. Таким образом, характер * неопределенного поведения *. – WhozCraig

ответ

4

Ваш код вызовет неопределенное поведение. Может произойти все, что угодно. Макросы в операторах

j = PRODUCT(i++); 
k = PRODUCT(++i); 

будут расширены до

j = x++ * x++; 
k = ++x * ++x; 

В обеих утверждениях x модифицируются более чем один раз между двумя точками последовательности.

+1

... и это входит в мои книжные списки «Rep-PersonalServicesWorker of the Month». –

+0

@MartinJames; Ну, я уже получил ваш комментарий к вопросу. Не нужно повторять здесь. В любом случае это оскорбительно. Различные люди разные оттенки. – haccks

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