Вывод программы на C - PullRequest
       0

Вывод программы на C

3 голосов
/ 26 марта 2012

Я написал следующую программу на Си.Выход 32. Почему это?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define max 10+2

int main(){
    int i;
    i = max * max;
    printf("\n%d\n",i);

    return 0;
}

(я изучаю C и относительно новичок в этом.)

Ответы [ 4 ]

6 голосов
/ 26 марта 2012
#define max 10+2

Это препроцессор. это не умно.

это глупо.

он просто заменяет текст.

max*max

разрешит до

10+2*10+2

что составляет

10+(2*10)+2

из-за приоритета оператора, который

10 + 20 + 2

т.е. 32

Кроме того, вам следует избегать макросов препроцессора, когда это возможно, и использовать static const вместо . Вы можете или не можете также рассмотреть возможность использования const переменной или enum вместо #define; у каждого есть свои компромиссы, обратитесь к аналогичному вопросу: "static const" vs "#define" vs "enum" .

Если вы хотите придерживаться препроцессора, то вы можете просто использовать:

#define max (10+2)

Поскольку код в скобках будет иметь приоритет оператора.

2 голосов
/ 26 марта 2012

Поскольку max является макросом, он расширяется текстовым образом, поэтому ваш код содержит:

i = 10 +2 * 10 + 2;

Для такого макроса обычно требуется добавить скобки:

#define max (10+2)

Таким образом, ваше выражение расширится до:

i = (10+2) * (10+2);
1 голос
/ 26 марта 2012

Компилятор видит это

i = 10 + 2*10 +2 = 32

Вы должны сделать определение макроса следующим образом

#define max (10+2)
0 голосов
/ 26 марта 2012

Приоритет оператора - забавная вещь. PEMDAS = круглые скобки, экспоненты, умножение, деление, сложение, вычитание.

Это будет разрешаться равным 10 + (2 * 10) + 2. Сначала 10 * 2, что равно 20.

Теперь он читает 10 + 20 + 2. Остальное должно быть ясно.

Вы должны осуществлять контроль над своей арифметикой в ​​любое время.

...