It is currently 27-07-2017 07:28

Найдите ошибки в следующем коде

Найдите ошибки в следующем коде

by kartman » 2016-11-08 06:45:47

Дан код:

unsigned int i;
for (i = 100; i >= 0; --i)
printf("%d\n", i);


В коде есть две ошибки.

Кто найдет +5 к репутации :)

kartman
admins
 
Rating: 676

CRYPT EXE / DLL SUBSCRIPTION

by Admin » 2017-07-27 07:28:19

CRYPT EXE / DLL SUBSCRIPTION

AUTOCRYPT + (S)FTP UPDATE 24/7

Admin
 

Найдите ошибки в следующем коде

by rx0tx0 » 2016-11-08 08:20:04

ответ ниже:
Для просмотра скрытого текста необходимо зарегистрироваться и авторизоваться.
rx0tx0
cfud candidate
 
Rating: 31

Найдите ошибки в следующем коде

by 1913 » 2016-11-10 02:46:32


1. В цикле нужно стараться использовать со знаком тип переменной, если не требуют обстоятельства в обязательном порядке использовать переменную без знака.
В данном случае переменная без знака создает логику вечного цикла, и компилятор сгенерирует код именно так. Вот код на ассемблере этого цикла в отладчике, который сгенерировал компилятор:

Нужно, чтобы правильно заработал код, изменить тип переменной: (первый вариант)
int i;
for (i = 100; i >= 0; --i)
printf("%d\n", i);

2. Если обстоятельства требуют использовать в обязательном порядке переменную типа unsigned int, то можно изменить код следующим образом: (второй вариант)
unsigned int i;
for (i = 100; -1 > i; i--)
printf("%d\n", i);

3. Главная здесь ошибка в том, что в цикле не используются {}
Код имеет свойство постоянно модифицироваться и дополняться (а обычно это и происходит), и может потребоваться добавить в цикл еще 1-2 строки кода или даже больше, и {} все равно пройдется добавить так, что их лучше всегда писать сразу...
4. Переменная была вынесена за пределы цикла, что при определенных условиях может создать проблемы.
Если переменную планируется использовать только в цикле, то ее и надо объявлять только в цикле (for(int i = 100; …), дабы случайным образом не изменить где-то в другом месте...
5. Лучше семантически (ИМХО) использовать вместо i-- i-=1, что так же позволит легко изменять код при необходимости, если это потребуют обстоятельства.
В C++ операции -- или ++ - иногда для них имеет огромное значение расположение до или после имени переменой, лучше всегда ставить ПОСЛЕ, и ДО ставить, только если требуют обстоятельства.
Поэтому, на мой взгляд, лучший вариант данного кода должен быть таким: (третий вариант)
for(int i = 100; i >= 0; i-=1)
{
printf("%d\n", i);
}
1913
Crypters
 
Rating: 71

Найдите ошибки в следующем коде

by kartman » 2016-11-10 03:51:32

Верно) Днем докину репутации :) 2694 +5 за первый ответ , 1913 +10 за развернутый ответ.
kartman
admins
 
Rating: 676