Здесь присваивание i значения
}
Здесь присваивание i значения 1 приводит к усечению старших
16 бит 1, при этом в i остается значение 0.
Использование точки с запятой
-----------------------------------------------------------------
Следующий фрагмент программы на первый взгляд выглядит прек-
расно:
for (x = 0; x < 10; x++);
{
... /* будет выполнено 1 раз */
}
Почему фрагмент в фигурных скобках будет выполнен только 1
раз? При ближайшем рассмотрении оказывается, что в конце выраже-
ния for содержится точка с запятой (;). Это труднообнаруживаемая
ошибка приводит к тому, что цикл выполниться 10 раз, не реализуя
никаких действий. Последующий блок выполниться только 1 раз. Это
неприятная ошибка, так как ее нельзя обнаружить с помощью обычных
методов проверки и идентификации блоков программы.
Макрокоманды с побочными эффектами
-----------------------------------------------------------------
Следующая проблема может заставить вас никогда не использо-
вать макрокоманды #define:
#define toupper(c) 'a'<= (c)&&(c)<='z' ? (c)-'a'-'A': (c)
char c, *p;
c = toupper(*p++);
Здесь p увеличивается 2 или 3 раза, в зависимости от регист-
ра символа (строчная или прописная буква). Такую ошибку очень
трудно найти, так как побочный эффект скрыт внутри макроопределе-
ния.
Повторение имен локальных динамических переменных
-----------------------------------------------------------------
TDeb 3.0 #2-3 = 130 =
Следующую ошибку также трудно обнаружить:
myfunc()
{
int n;
for (n=5; n >= 0; n--)
{