Почему моя программа C выводит это? - PullRequest
3 голосов
/ 07 марта 2011

Я пытаюсь решить два вопроса, связанных с препроцессором, но в обеих программах я получаю результаты, которые не могу понять, как. Ниже моя программа:

#include<stdio.h>
#define SQUARE(x) x*x
int main()
{
float s=10,u=30 ,t=2,a;
a=2*(s-u*t)/SQUARE(t);
printf("Result:%f\n",a);
return 0;
}

По моему мнению, вывод этой программы должен быть -25.000, но я получаю -100.000.

А во второй программе:

#define FUN(i,j) i##j
int main()
{
int val1 = 10;
int val12 = 20;
clrscr();
printf("%d\n",FUN(val1,2));
getch();
}

Вывод должен быть 102, но я получаю 20; почему так?

Ответы [ 4 ]

11 голосов
/ 07 марта 2011
#define SQUARE(x) x*x

должно быть

#define SQUARE(x) ((x)*(x))

Действительно, без скобок 2*(s-u*t)/SQUARE(t) раскрывается как

2*(s-u*t)/t*t

, что интерпретируется как

(2*(s-u*t)/t)*t

Что касается вашей второй проблемы, FUN(val1,2) будет расширен как val12 в соответствии с семантикой оператора ##.До сих пор не ясно, каково ваше намерение: строка printf будет пониматься как

printf("%d\n", val12);

, которая будет печатать 20.

4 голосов
/ 07 марта 2011

первый:

a=2*(s-u*t)/SQUARE(t);

после замены определения мы получаем:

a=2*(s-u*t)/t*t;

сейчас, так как у нас нет () в определении SQUARE, мы получаем:

a=2*(10-30*2)/2*2; --> a=2*(-50)/2*2; --> a=-100/2*2; --> a=-50*2; --> a=-100

если вы хотите получить -25, вы должны определить SQUARE(x) как (x*x).

Редактировать: добавить объяснение относительно второго примера.

printf("%d\n"FUN(val1,2));

еще раз, сначала мы должны заменить определение (напоминание: ## «объединяет» строку определения - я не могу найти идеальные слова, чтобы объяснить это, так что просто посмотрите на пример ...)):

printf("%d\n",val12);  [note: the comma (,) is missing - so it won't compile.]

, поскольку значение val12 равно 20, вот что вы получите.

смысл этих двух примеров в том, чтобы помнить, что мы всегда должны иметь дело ссначала определяет (поскольку в «реальной жизни» компилятор (или препроцессор) делает это до времени выполнения)

Надеюсь, это поможет ..

3 голосов
/ 07 марта 2011

Для первого случая,

a=2*(s-u*t)/SQUARE(t);

будет переводиться в

a=2*(s-u*t)/t*t;

во время компиляции.Это распространенная ошибка, допущенная препроцессорами.

0 голосов
/ 06 мая 2019

я знаю, что опоздал, но у меня идеальный ответ.

в c # at define используется для вызова текста в том виде, как он есть в параметре функции,

пример,#define hai (s1) printf ("% s =% s", # s1, s1);

       in main: i am calling as hai(tom); tom was initialized as "india" string.

вывод для этого - tom = india, строка вызова tom печатается с помощью #.

аналогично ## используется для извлечения текста из аргумента функции, объединения их и возврата значения объединенного идентификатора.

у вышеприведенной программы есть два аргумента va1 и 2., переданные в iи j.тогда va1 и 2 соединяются.и форма va12.

va12 - это идентификатор, доступный со значением 20. поэтому возвращается 20.

...