2015-07-29 5 views
-2

Я собрал программу quickie, чтобы сделать выход мейнфрейма заблокированным в 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; 

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

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

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

Итак, помните MiDAS, и вы станете Золотым!

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

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

+0

«Я оказался человеком» - не уверен, вы, кажется, очень дешевый калькулятор :) –

+1

Даже лучше, чем статья в википедии [здесь спецификация] (https://msdn.microsoft.com/ru -us/library/aa691323 (v = vs.71) .aspx), показывающий, как C# обрабатывает порядок всех операций. MiDAS не поможет вам выполнить 'var result = 6 << 7% someVar ++ * 7;' –

Смежные вопросы