Страница 68 из 69
Пропуск break в операторе switch
----------------------------------------------------------------
Как вы помните, оператор break используется в операторе
switch в конце каждой помеченной альтернативы выбора. Пожалуйста,
не забывайте это. Если вы забудете поставить break в данную поме-
ченную альтернативу выбора, то операторы следующих альтернатив
выбора, помеченных за ней, будут также выполняться.
- 561,562 -
Индексы массивов
-----------------------------------------------------------------
Не забудьте, что индекс массива начинается с элемента [0], а
не с элемента [1]. Наиболее распространенная ошибка может быть
проиллюстрирована на примере следующей программы:
main()
{
int list[100],i;
for (i = 1; i
printf("Введите два значения:");
scanf("%d %d",a,b);
sum = a + b;
printf("Сумма значений равна: %d\n",sum0;
}
Нашли? Ошибка в операторе
scanf("%d %d",a,b);
Вспомните, что scanf требует от вас передачи адресов, а не
значений!
То же самое относится к любым функциям, содержащим в качест-
ве формальных параметров указатели. Программа, написанная выше,
оттранслируется и выполнится, но при этом scanf возьмет какие-то
случайные значения (мусор), находящиеся в a и b и использует их
как адреса, по которым будут записаны введенные вами значения.
Правильно этот оператор необходимо записать так:
scanf("%d %d", &a, &b);
Здесь функции scanf передаются адреса a и b, и введенные
значения правильно запоминаются в этих переменных по их адресам.
Та же неприятность может случиться с вашей собственноручно
написанной функцией. Помните функцию swap, которую мы определили
в параграфе об указателях?
Что произойдет, если вы вызовете ее следующим образом:
main()
{
- 565,566 -
int i,j;
i = 421;
j = 53;
printf("До обработки: i = %fd j = %fd\n",i,j);
swap(i,j);
printf("После обработки: i = %fd j = %fd\n",i,j);
}
Переменные i и j будут иметь одни и те же значения как до,
так и после их обработки путем обращения к функции swap; однако
значения адресов чисел 421 и 53 будут переставлены, что породит
некоторые хитрые и труднообнаружимые ошибки. Как избежать этого?
Пользуйтесь прототипами функций и полными определениями
функций.
И действительно, вы получили бы ошибку при выполнении main,
если бы swap была описана так, как в этой главе. Если же вы опре-
делите ее таким образом, как представлено далее, то программа
выполнится без ошибок:
void swap(a,b)
int *a,*b;
{
...
}
Вынесение описания переменных a и b из скобок отключает
контроль над ошибками, проводимый в противном случае; это являет-
ся лучшим доводом в пользу того, чтобы не использовать классичес-
кий стиль при определении функции.
- 567,568 -
В добрый путь
----------------------------------------------------------------
Как и говорилось в начале предыдудущей главы, мы не можем
дать вам полное представление о Си только в двух главах. Но мы
предложили вам оптимальный вариант знакомства с этим языком прог-
раммирования. Что вам теперь делать дальше - ответ в предостав-
ленных вам примерах программ: компилируйте их, выполняйте, и (что
более важно) модифицируйте их для того, чтобы понять что же
все-таки произойдет, если вы что-нибудь измените в программе.
Удачи вам, счастливого пути в познании тайн
программирования на Си!