Почему этот расчет не работает?
Я собирал программу быстрого доступа, чтобы получать выходные данные мэйнфрейма, заблокированные в длинах 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 - Пожалуйста, извините мою дорогую тетю Салли - и относится к круглым скобкам, экспонентам, умножениям, делениям, сложениям и вычитаниям.