2015-09-22 2 views
3

Я учусь K & классический C книга по программированию второго издания R, вот пример на странице 17:путаница междунар, полукокса и EOF в C

#include <stdio.h> 
/* copy input to output*/ 
main() 
{ 
    int c; 
    // char c works as well!! 
    while ((c = getchar()) != EOF) 
     putchar(c); 
} 

это указано в книге, что int c используется удерживать EOF, что оказывается -1 на моей машине Windows с GCC и не может быть представлено char. Однако, когда я пробовал char c, он работает без проблем. Любопытно я попробовал несколько больше:

int a = EOF; 
char b = EOF; 
char e = -1; 
printf("%d %d %d %c %c %c \n", a, b, e, a, b, e); 

и выход -1 -1 -1 без какого-либо символа отображается (на самом деле в соответствии с ASCII-таблицей для %c, c здесь должна быть nbs(no-break space) отображается, но она невидима).

Итак, как можно присвоить charEOF без какой-либо ошибки компилятора?

Кроме того, учитывая, что EOF является -1, оба b и e выше назначен FF в памяти? Не должно быть иначе, как компилятор отличает EOF и nbs ...?

Update:

скорее всего EOF 0xFFFFFFFF отливают char 0xFF но в (c = getchar()) != EOF и LHS 0xFF является INT повышен до 0xFFFFFFFF перед сравнением с тем типом c может быть int или char.

В этом случае EOF случается 0xFFFFFFFF но теоретически EOF может быть любым значением, которое требует более 8 бит, чтобы правильно представлять с левым большинством байт не обязательно являющихся FFFFFF так, то char c подхода потерпит неудачу.

Ссылка: K & R Язык программирования C 2е

enter image description here

+0

мне кажется нравится -1 подходит просто отлично в знаковом 8bit целое (полукокс). можете ли вы опубликовать все заявление? потому что «EOF не может быть представлен char», кажется мне неправильным. также ASCII только 0-127, nbs является частью * extended ascii * – x4rf41

+1

Возможный дубликат [Использование int для типов символов при сравнении с EOF] (http://stackoverflow.com/questions/8464030/using-int-for- character-types-when-comparing-with-eof) – Downvoter

+3

Вам нужно каким-то образом различать '0xFF' и' EOF', иначе C не будет работать с двоичными файлами, содержащими байты со значением '0xFF' , Вот почему функции типа 'getchar()' возвращают целочисленные значения. –

ответ

2

EOF и 0xFF - это не то же самое. Поэтому компилятор должен различать их. Если вы видите man page for getchar(), вы должны знать, что он возвращает символ, который читается как неподписанный символ, переданный в int или EOF по окончании файла или ошибки.

Ваш while((c = getchar()) != EOF) расширяется до

((unsigned int)c != (unsigned int)EOF) 
+0

Спасибо! Таким образом, в 'char c = getchar()' является возвращаемое значение 'int', урезанное, поэтому только самые правые 8 бит присваиваются' c'? –

+0

EOF определяется как int, это не 0xff, это фактически 0xFFFFFFFF (-1 как 32bit int) (обычно). но если вы нанесете 0xFFFFFFFF на char, это будет 0xFF. поэтому да – x4rf41

+0

Косвенно. Кастинг 0xFFFFFFFF на 'char' сделал бы это 0xFF. – WedaPashi

2

Этот код работает, потому что вы используете подписалchar с. Если вы посмотрите на ASCII table, вы найдете две вещи: во-первых, всего 127 значений. 127 принимает семь битов для представления, а верхний бит - знаковый бит. Во-вторых, EOF не находится в этой таблице, поэтому ОС может свободно определять ее по своему усмотрению.

Назначение от char до int разрешено компилятором, потому что вы назначаете небольшой тип более крупному типу. int может быть способен представлять любое значение, которое может представлять char.

Заметим также, что 0xFF равен 255, когда интерпретируется как unsigned char и -1, когда интерпретируется как signed char:

0b11111111 

Однако, когда представлены в виде 32-битового целого числа, это выглядит очень разные:

255 : 0b00000000000000000000000011111111 
-127: 0b11111111111111111111111110000001 
+1

Hr-rmp, 0xFF равен 255. –

+1

ok, я не буду редактировать дальше без 0xFF == 255 и 0xFF равно -1 (с 8-битной подписью) не -127. можете ли вы исправить это? – x4rf41

+0

Хорошие уловы, спасибо за изменения и комментарии. – Alex

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