Почему этот расчет не работает?

Я собирал программу быстрого доступа, чтобы получать выходные данные мэйнфрейма, заблокированные в длинах 133 байта, все заканчивающиеся CRLF, и это работало, за исключением моего подсчитанного количества строк в выводе. Поскольку размер вывода составлял X страниц по 133 байта с 2 байтами (CRLF) в конце, я рассчитывал количество строк следующим образом:

lineCount = fileLength - 2 / 133;

Для длины файла 3194 это работает до 24 строк. Возьмите 3194, вычтите 2 для CRLF, и вы получите 3192, и это будет разделено на 133, чтобы получить 24. Просто! Сумасшедшая вещь, я получаю lineCount равный fileLength!

Что я могу делать не так?

1 ответ

Изучив это несколько раз, я наконец наткнулся на это! Это вопрос печально известного Порядка операций!

lineCount = fileLength - 2 / 133;

Если я оцениваю это слева направо, в соответствии с моим описанием выше, это работает нормально, но я человек, а не процессор. Другое правило! Процессор компьютера должен использовать другое правило: MiDAS: умножения, деления, сложения и вычитания.

Мой код вычислял 2 / 133, что для целых равно 0. Он затем вычитал 0 из fileLength и, конечно, устанавливал lineCount в это значение. Я древний, вроде бы, и должен был знать лучше с самого начала, но, думаю, я спешил. Правильный код?

int lineCount = ((fileLength - 2) / 133);

Итак, помни MiDAS и ты будешь Золотым!

ПРИМЕЧАНИЕ: это сложнее, чем это, на самом деле. Полное правило охватывает скобки и возведение в степень. Для расширенного взгляда на эту проверку Wikipedia для Порядка операций.

В США мнемоника больше похожа на: PEMDAS - Пожалуйста, извините мою дорогую тетю Салли - и относится к круглым скобкам, экспонентам, умножениям, делениям, сложениям и вычитаниям.

Другие вопросы по тегам