Ниже приведен список достаточно часто возникающих ошибок при написании программ на языке Си. Описание устроено по принципу "симптом – причина", как в инструкциях по устранению неисправностей в бытовой технике: "Не работает телевизор? Проверьте, что он включен в розетку!". Точное место возникновения некоторых ошибок можно узнать при помощи отладчика, другие ошибки можно выявить по необычному поведению программы.
if(a = b) { // <------- ==
// ...
}
В приведенном виде выполняется присваивание a = b
,
новое значение переменной a
используется как
логическое значение. Оператор if будет выполняться только в том
случае, когда b
отлично от нуля.
for(k = 0; k < 100; k++); // <------- лишняя ; в конце строки
{
printf("k=%d\n", k);
}
Здесь получается, что внутри цикла выполняет пустой
оператор ;
, а после цикла один раз (всегда)
выполняется составной оператор { ... }
.
for(k = 0; k < 100; k+1) // <------- k++ или k = k+1
{
// ...
}
В приведенном виде значение управляющей переменной цикла
(k
) не изменяется после итерации, так как выражение
k+1 не меняет значения переменной (не имеет побочного значения). Должно было быть k++
, ++k
, k += 1
или k = k+1
.
int x=0;
scanf("%d", x); // <------- &x
Если в этом примере переменной x не присваивать начального
значения, то при компиляции для второй строчки может появится
сообщение "используется значение неинициализированной
переменной". Выражение &x
, которое
здесь должно было использоваться при вызове
scanf, всегда имеет корректное значение, независимо от значения
x. Это адрес памяти по которому хранится переменная x. Если же
операция взятия адреса не используется, то вместо адреса в
функцию передается значение x.
"%lf"
, для int – "%d"
.
double x=0;
if(1 != scanf("%d", &x)) // <------- "%lf"
/* что-то делаем */;
double sum; // <------- sum не имеет начального значения
int k;
for(k = 1; k < 100; k++) {
sum += 1.0/k; // <------- sum не имеет начального значения
}
Оператор sum += 1.0/k;
является сокращенной
записью sum = sum + 1.0/k;
. При первой итерации
цикла выражение в правой части может приводить либо к
неопределенному результату (переменная sum содержит какое-то
число, но его значение заранее неизвестно), либо к ошибке, если
по адресу &sum
записано что-то, что не является
значением типа double.
for(k = 0; k < length; k++) ...
(от нуля и строго
меньше длины массива).