Информатика и технология программирования


" Подводные камни" и " маленькие хитрости" - часть 2


Поэтому само по себе наличие в выражении операнда большей разрядности еще не гарантирует правильности вычислений для больших значений. Это видно на примере, где используется переменная типа long для хранения произведения переменных типа int . Ошибка состоит в том, что операция умножения все равно будет производиться с целыми размерности int , что может привести к потере значащих цифр произведения:


int a,b; long c;
c = a * b; // Неправильно


c = (long)a * b; // Правильно

Операция присваивания, операция "запятая" и условная операция позволяют выполнять многие действия "на лету", не выходя за пределы синтaксиса выражения в условных выражениях оперaторов if, while , например:


while ((c=getchar()) !='*') {...c...}

Здесь в переменной c запоминается результат функции, вызванной во время проверки условия в операторе while, с целью дальнейшего его использования в теле оператора.


while (x0=x1, x0 &#62 0) {... x1 =f(x0) ...}

Присваивание выполняется во время проверки условия в операторе цикла.


for (...; d&#62 0 ? a&#62b : b&#62=a; ...) {...}

В зависимости от значения переменной d меняется условие продолжения цикла for .

При наличии в программе нескольких вариантов выбора по группе условий программа становится "сильно ветвистой", например:


if (a&#60b)
if (a&#60c)
if (b&#60c) {...} // a &#60 b &#38&#38 a &#60 c &#38&#38 b &#60 c


else {...} // a &#60 b &#38&#38 a &#60 c &#38&#38 b &#62=c


else
if (b&#60c) {...} // a &#60 b &#38&#38 a &#62=c &#38&#38 b &#60 c


else {...} // a &#60 b &#38&#38 a &#62=c &#38&#38 b &#62=c


else ...

Можно воспользоваться тем, что операция сравнения дает целый результат (1 или 0) и сформировать переменную, принимающую уникальное значение для каждой комбинации сравнений. Тогда программа примет хотя и менее понятный, но зато более регулярный вид:


int n; n = (a &#60 b)*4 + (a &#60 c)*2 + (b &#60 c);
switch(n)
{
case 0:... break; // a &#62=b &#38&#38 a &#62=c &#38&#38 b &#62=c



case 7: ... break; // a &#60 b &#38&#38 a &#60 c &#38&#38 b &#60 c


}




Начало  Назад  Вперед



Книжный магазин