Вывод программы на C сбивает с толку - PullRequest
6 голосов
/ 26 февраля 2011
#include<stdio.h>
#include<conio.h>
#define PROD(x) (x*x)
void main()
{
clrscr();
int p=3,k;
k=PROD(p+1); //here i think value 3+1=4 would be passed to macro
printf("\n%d",k);
getch();
}

На мой взгляд, вывод должен быть 16, но я получаю 7.

Может кто-нибудь сказать, пожалуйста, почему?

Ответы [ 7 ]

21 голосов
/ 26 февраля 2011

Макросы расширены , у них нет значений , переданных им . Посмотрите, к чему расширяется ваш макрос, в операторе, присваивающем k.

k=(p+1*p+1);

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

#define PROD(x) ((x)*(x))
5 голосов
/ 26 февраля 2011

Препроцессор расширяет PROD (p + 1) следующим образом:

k = (p+1*p+1);

При p = 3 это дает: 3 + 1 * 3 + 1 = 7.

Вы должнынаписал ваш #define следующим образом:

#define PROD(x) ((x)*(x))
5 голосов
/ 26 февраля 2011

Проблема здесь в том, что PROD является макросом и не будет вести себя точно так, как вы намереваетесь. Следовательно, это будет выглядеть так:

k = p+1*p+1

Что, конечно, означает, что у вас есть:

k = 3+1*3+1 = 7
2 голосов
/ 26 февраля 2011

Это то, что компилятор увидит после того, как препроцессоры выполнят свою работу: k = p + 1 * p + 1. Когда p = 3, это оценивается как k = 3+ (1 * 3) +1. Отсюда 7.

2 голосов
/ 26 февраля 2011

макрос не работает. Они заменены на имя

Это будет p+1*p+1

2 голосов
/ 26 февраля 2011
#define PROD(x) (x*x)

PROD(3+1) изменяется препроцессором на 3+1*3+1

1 голос
/ 26 февраля 2011

Именно поэтому вы должны использовать функции вместо макросов. Функция оценивает каждый параметр только один раз. Почему бы не попробовать

int prod (int x)
{возврат х * х; }

и увидите разницу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...