Макросы расширены , у них нет значений , переданных им . Посмотрите, к чему расширяется ваш макрос, в операторе, присваивающем k
.
k=(p+1*p+1);
Предпочитайте функции макросам, если вам нужно использовать макрос, минимум, что вы должны сделать, это заключить в скобки параметры. Обратите внимание, что даже это может привести к неожиданностям, если пользователи будут использовать его с выражениями, которые имеют побочные эффекты.
#define PROD(x) ((x)*(x))