смешные ошибки в C/C++
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
смешные ошибки в C/C++
Иногда возникают очень смешные ошибки в коде C/C++ ... обычно из-за механической ошибки (дребезг клавиатуры или проглоченный символ ).
Часто такие ошибки особо трудно диагностировать!
Некоторые я решил здесь коллекционировать (многие возникли из реальных задач и кодов).
Смешными будем называть ошибку, когда синтаксическая конструкция из-за описки или небрежности не становится синтаксической ошибкой (т.е. не диагностируется), но приобретает совершенно другой смысл.
Каждая задачка будет в 2 сообщения ... чтоб была возможность самостоятельно подумать:
- 1-е сообщение - формулировка задачи;
- 2-е сообщение - результат и объяснение;
Часто такие ошибки особо трудно диагностировать!
Некоторые я решил здесь коллекционировать (многие возникли из реальных задач и кодов).
Смешными будем называть ошибку, когда синтаксическая конструкция из-за описки или небрежности не становится синтаксической ошибкой (т.е. не диагностируется), но приобретает совершенно другой смысл.
Каждая задачка будет в 2 сообщения ... чтоб была возможность самостоятельно подумать:
- 1-е сообщение - формулировка задачи;
- 2-е сообщение - результат и объяснение;
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: смешные ошибки в C/C++
Вот такая ошибка, которую только недавно мне пришлось разгребать в чужом коде...
Что выведет вот такая программа?
Что выведет вот такая программа?
Код: Выделить всё
#include <stdio.h>
int main() {
int i, arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
n = sizeof( arr ) / sizeof( arr[ 0 ] );
for( i = 0; i << n; i++ )
printf( "%d, ", arr[ i ] );
printf( "\n" );
return 0;
}
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: смешные ошибки в C/C++
Очевидно, что предполагался вывод: 1, 2, 3, 4, 5, 6, 7, 8, 9Olej писал(а): Что выведет вот такая программа?
Но получим:
Код: Выделить всё
[olej@dell error]$ ./logc1
[olej@dell error]$
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: смешные ошибки в C/C++
На предыдущем примере можно построит гораздо более замысловатый пример ... например в цикле сверху вниз:
Очевидно, предполагается получить: 9, 8, 7, 6, 5, 4 ... элементы с [8] по [3]
Что получится на самом деле?
P.S. Попав в такую засаду, из неё можно долго выгребаться.
Код: Выделить всё
#include <stdio.h>
int main() {
int i, arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
n = sizeof( arr ) / sizeof( arr[ 0 ] );
for( i = n - 1; i >> 2; i-- )
printf( "%d, ", arr[ i ] );
printf( "\n" );
return 0;
}
Что получится на самом деле?
P.S. Попав в такую засаду, из неё можно долго выгребаться.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: смешные ошибки в C/C++
Olej писал(а): Очевидно, предполагается получить: 9, 8, 7, 6, 5, 4 ... элементы с [8] по [3]
Что получится на самом деле?
Код: Выделить всё
[olej@dell error]
$ ./logc2
9, 8, 7, 6, 5,
- Вложения
-
- error.tgz
- (568 байт) 181 скачивание
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: смешные ошибки в C/C++
Совсем уж традиционная ошибка, о которой везде предупреждают 100 раз ... и всё-равно на неё попадаются: когда в условии вместо == прописывают =
Предполагается, очевидно, что ожидается значение i == 2 - найден нулевой элемент в массиве.
Что будет на самом деле?
Код: Выделить всё
#include <stdio.h>
int main() {
int i = 0, arr[] = { 1, -1, 0, 2, -2, 0, 3, -3, 0 };
while( 1 ) {
if( ( arr[ i ] < -1 ) || ( arr[ i ] = 0 ) ) break;
i++;
}
printf( "%d\n", i );
return 0;
}
Что будет на самом деле?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: смешные ошибки в C/C++
Olej писал(а):Предполагается, очевидно, что ожидается значение i == 2 - найден нулевой элемент в массиве.
Что будет на самом деле?
Код: Выделить всё
[olej@dell error]$ make eq
gcc -Wall -O0 -o eq eq.c
[olej@dell error]$ ./eq
4
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей