Это классическая проблема с препроцессором.Проблема в том, что когда вы пишете
#define BUFFERWIDTH 2*WIDTH
temp3 = 199%BUFFERWIDTH;
Препроцессор расширяет это до
#define BUFFERWIDTH 2*WIDTH
temp3 = 199 % 2 * WIDTH;
Обратите внимание, что это интерпретируется как
temp3 = (199 % 2) * WIDTH;
вместо намеченного
temp3 = 199 % (2 * WIDTH);
Чтобы исправить это, у вас есть несколько вариантов.Во-первых, вы можете заключить в скобки свое определение BUFFERWIDTH
следующим образом:
#define BUFFERWIDTH (2*WIDTH)
temp3 = 199%BUFFERWIDTH;
Теперь это расширится до
temp3 = 199 % (2 * WIDTH);
, как и ожидалось.Однако лучшим вариантом было бы использовать const
для определения ваших констант:
const int BUFFERWIDTH = 2 * WIDTH;
temp3 = 199%BUFFERWIDTH;
Теперь это интерпретируется правильно, поскольку константы понимаются компилятором, а не препроцессором.
В целом, я настоятельно призываю вас не использовать #define
для определения констант.#define
по сути является механизмом поиска и замены в исходном коде, который не имеет семантического или синтаксического понимания того, что он заменяет.Это не очень хорошо работает с приоритетом операторов, поэтому вы легко можете столкнуться с такими ошибками.const
, с другой стороны, - это , понятный компилятору для определения константы, и поэтому выражения будут правильно вычисляться, когда в игру вступит приоритет оператора.
Надеюсь, это поможет!