﻿# V739\. EOF should not be compared with a value of the 'char' type\. Consider using the 'int' type\.

Анализатор обнаружил, что константа EOF сравнивается с переменной типа 'char' или 'unsigned char'\. Это свидетельствует о том, что некоторые символы будут обрабатываться программой неверно\.

Рассмотрим, как объявлен EOF:

```cpp
#define EOF (-1)
```

Как видите, EOF есть ни что иное как '\-1' типа 'int'\. Посмотрим, к каким последствиям это может приводить\. Первый пример:

```cpp
unsigned char c;
while ((c = getchar()) != EOF)
  { .... }
```

Беззнаковая переменная 'c' никогда не будет равна отрицательному значению '\-1'\. Поэтому выражение \(\(c \= getchar\) \!\= EOF\) всегда истинно, и возникает вечный цикл\. Такая ошибка будет сразу замечена и исправлена\. Поэтому не будем продолжать обсуждать тип 'unsigned char'\. 

Рассмотрим более интересный случай:

```cpp
signed char c;
while ((c = getchar()) != EOF)
  { .... }
```

Функция getchar\(\) возвращает значения типа 'int'\. А именно \- она может вернуть число от 0 до 255 или \-1 \(EOF\)\. Прочитанные значение помещаются в переменную типа 'char'\. Из\-за этого символ со значением 0xFF \(255\) превращается в \-1 и интерпретируется точно также как конец файла \(EOF\)\.

Пользователи, использующие [Extended ASCII Codes](https://en.wikipedia.org/wiki/Extended_ASCII), иногда сталкиваются с ошибкой, когда один из символов их алфавита некорректно обрабатывается программами\.

Например, последняя буква русского алфавита в кодировке [Windows\-1251](https://en.wikipedia.org/wiki/Windows-1251) как раз имеет код 0xFF и воспринимается некоторыми программами как конец файла\.

Исправленный вариант кода:

```cpp
int c;
while ((c = getchar()) != EOF)
```