2016-11-21 1 views
-1

В glibc reference мы находим такие слова:Почему тестирование для знака int называется «неаккуратным кодом» в ссылке glibc?

... небрежный код, как

{ 
    int c; 
    ... 
    while ((c = getc (fp)) < 0) 
    ... 
} 

должен быть переписано ...

Почему тестирование для знака ИНТ называется «неаккуратным кодом» в ссылке glibc?

+0

Это уже объяснено чуть ниже (ваша цитата), т. Е. WEOF не обязательно должен быть нагативным. – usr

+1

Просто внимательно прочитайте текст вокруг этого кода. Речь идет не о проверке знака. Речь идет о сравнении результата с «WEOF/EOF» явно. «EOF» должен быть отрицательным, и это единственное отрицательное значение, которое 'getc()' может возвращать. Так что популярная дурная привычка писать 'getc() <0' вместо' getc()! = EOF'. И эта привычка может быть интерполирована на 'wgetc()', но поскольку 'WEOF' не должен быть отрицательным, код типа wgetc() <0' может работать не так, как ожидалось. – Sergio

+0

@Sergio: это замечание о 'WEOF' и' EOF' строго верно, но было бы намеренно ввести в заблуждение, чтобы определенный «WEOF' сделал что-то отличное от« EOF »и что любой из них отличается от« -1 ». – chqrlie

ответ

2

Это связано с использованием макроса WEOF. Как уже упоминалось в reference (курсив мой)

WEOF не должен иметь то же значение, как и в отличие от EOFEOFтакже нужно не быть отрицательным. [...]

Таким образом, проверка < 0 может быть неправильное решение, строго говоря, он должен быть проверен на возвращаемое значение самого WEOF.

+0

@IgorLiferenko это не строго о 'WEOF', это общая проблема, в примере используется' WEOF', это ваш комментарий относительно части _sloppy_. –

Смежные вопросы