Использование макроса приводит к неправильному выводу при использовании в качестве части большего математического выражения - почему это происходит? - PullRequest
6 голосов
/ 22 января 2010

Это обычная программа на С, которую я обнаружил в каком-то банке вопросов. Это показано ниже:

#define CUBE(p) p*p*p

main()
{
    int k;
    k = 27 / CUBE(3);
    printf("%d", k);
}

Согласно моему пониманию и знанию, значение K должно быть 1, поскольку CUBE (3) будет заменен на 3 * 3 * 3 во время предварительной обработки, и после последующей компиляции он будет давать значение 1, но вместо этого он имеет показал значение 81, что заставило меня любопытно узнать, как это произошло.

Может ли кто-нибудь обосновать ответ 81 на этот вопрос выше.

Ответы [ 13 ]

0 голосов
/ 22 января 2010

Когда вы делаете макросы, вы должны быть осторожны с тем, как поместить круглые скобки. В этом случае у вас их нет, поэтому выражение становится 27/3 * 3 * 3, которое по правилам предшествования / и * становится (27/3) * 3 * 3.

0 голосов
/ 22 января 2010
k=27/CUBE(3);  =>   k=27/3 * 3 * 3;

Вы это видите? CUBE должен быть определен следующим образом:

#define CUBE(p) ((p)*(p)*(p))
0 голосов
/ 22 января 2010
     #define CUBE(p) p*p*p
     main()
     {
        int k;
        k=27/CUBE(3);
        printf("%d",k);

     }

Согласно моему пониманию и знанию, значение K должно быть 1, поскольку CUBE (3) будет заменен на 3 * 3 * 3 во время предварительной обработки

YES

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

НЕТ,

k= 27/3*3*3 

 =(((27/3)*3)*3) (The precedence of `*` and `/` are same but the associativity is from left to right)
 =((9*3)*3) =81

Заменить #define CUBE(p) p*p*p на #define CUBE(p) ((p)*(p)*(p))

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