(Упражнение 1.6 K&R) как верфий, что getchar ()!= EOF РАВНО 0 ИЛИ 1?

Я только начал изучать Программирование (C) в качестве хобби, самостоятельно. Я с помощью K&Р.

 main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}

убедитесь, что getchar() != EOF РАВНО 0 ИЛИ 1

кажется, я понимаю, что происходит:

  1. C присваивается следующий символ с клавиатуры
  2. C проверяется, является ли это EOF или нет
  3. c присваивается 1 или 0, в зависимости от того, является ли это EOF или нет.
  4. отображается символ на выходе, или если EOF завершает программу.

однако мое решение неверно, поэтому ясно, что я чего-то не понимаю:

main ()
{
    int c;

    while ((c = getchar()) != EOF)
        printf("%dn", c);
}

Это просто печатает значение символа. А также печатает "10", если я нажимаю клавишу возврата каретки.

Я думал, что он напечатает c. Однако он печатает значение символа, а не значение 1 или 0.

Я знаю, что c присваивается 1 или 0 после сравнения с EOF. Но я не уверен, какая логика мне нужна. можно использовать, чтобы показать это. Кажется, мне нужно как-то "выйти" из показа значения символа и вместо этого показать значение сравнения. Это значит мне нужно выйти из цикла while? Если да, то я не знаю, как (и это только догадка).

как я могу просто проверить, что c = 1 или 0?

а также, как я должен это знать? должно быть что-то фундаментальное, что я должен извлечь из этого, я полагаю.

main ()
{
    int c;

    while ((c = getchar()) != EOF != 0 != 1)
        putchar(c);
}

Я также сделал это и Я думаю, что это, кажется, работает. Поскольку он не выводит никаких символов, но я не уверен, что это решение, которое они ищут...

7 ответов


я знаю, что c присваивается 1 или 0 после сравнения с EOF

нет это не так. Посмотрите:

while ((c = getchar()) != EOF)

выражение : (c = getchar()) != EOF, который содержит другое выражение: (c = getchar()), который назначает c символ с клавиатуры. c не будет равно 0 или 1 ! это результат выражения. Попробуйте этот код:

int main()
{
   char value;
   int c;
   value = ((c = getchar()) != EOF);
   printf("%i\n", value);
   return 0;
}

этот код будет печатать значение выражения (c = getchar()) != EOF. На самом деле, ваш код может быть написан следующим образом:

int main ()
{
    int c;
    char value = ((c = getchar()) != EOF);
    while (value)
    {
        printf("%d\n", c);
        value = ((c = getchar()) != EOF);
    }
    return 0;
}

выражение не в while больше и его результат присваивается value. Приведенный выше код и ваш код будут обеспечивать точно такой же результат.


EDIT:

`main ()
{
    int c;

    while ((c = getchar()) != EOF != 0 != 1)
        putchar(c);
}`

это не решение! вот переписанный код:

`main ()
{
    int c;
    char value1;
    char value2;
    char value3;

    value1 = ((c = getchar()) != EOF);
    value2 = value1 != 0;
    value3 = value2 != 1;
    while (value3)
    {
        putchar(c);
        value1 = ((c = getchar()) != EOF);
        value2 = value1 != 0;
        value3 = value2 != 1;
    }
}`

так что же происходит ? скажем getchar вернет символ 'A'. Так что value1 будет равно 1, так как 'A' отличается от EOF. value2 будет равно 1, потому что value1 (что равно 1) отличается от 0. value3 будет равно 0, потому что value2 (что равно 1) равно не отличается от 1:while(value3) теперь while(0), поэтому никакие символы не будут напечатаны.

важно понимать, что переменной можно присвоить результат выражения сравнения (что означает выражение С хотя бы одним оператором сравнения), а также результат этот вид выражения равен 0 (для false) или 1 (для true).


несколько слов о комментарии OP:

Привет, спасибо. Но K&R явно говорит: "это имеет нежелательный эффект установки c в 1 или 0". Может быть, поэтому я в замешательстве.

c будет присвоено 0 или 1, Если while выглядит так:

while (c = getchar() != EOF)

оператор != имеет больший приоритет, чем оператор =. Это значит, что getchar() != EOF сначала будет оценено, а затем его результат будет присвоен c.


я понимаю, что вопрос старый, но выбранный ответ отвечает на что-то, что не то, что вопрос должен быть задан. (Это другой вопрос, заданный из книги) я здесь, чтобы прояснить несколько вещей и надеюсь, что другие люди, которые искали этот вопрос из Google, могут прочитать мой ответ для лучшего понимания вопроса 1-6 из 2-го издания языка программирования C.

вопрос задан убедитесь, что getchar() != EOF РАВНО 0 ИЛИ 1

книга намекала на это

**c = (getchar() != EOF)**

эквивалентно

**c = getchar() != EOF**

, когда getchar() != EOF проверяется,

если вход не EOF, тогда это должно быть правдой, следовательно, возвращая True или 1 в этом смысле.

и конечно, если вход is EOF, потом getchar() != EOF вернет False или 0.

вот почему либо 1 или 0 будет назначен в c.

для" нежелательного эффекта", упомянутого в книге, потому что ни 1, ни 0 является исходным входом, это означает, что исходный символ, предназначенный для вывода, является проиграл, а это нежелательно.

для тренировки, используйте следующее:

#include <stdio.h>

main()
{
    int c;
    while ( c = getchar() != EOF ) {
        printf("%d\n", c);
    }
}

если ваш вход не EOF, тогда он будет печатать 1.

если ваш вход EOF, тогда программа заканчивается.

Примечание: типа EOF в Windows, используйте Ctrl + Z

Edit:

более простое решение для выполнения 1.6 K & R.

printf("%d", getchar() != EOF);

' c ' присваивается значение из getchar, а затем проверяется, является ли это EOF.

если он не назначен EOF, выведите значение 'c'; если нет, существует цикл.

тест для EOF не переназначает какое-либо значение на "c", он только преуспевает или терпит неудачу

IOW, удалите Шаг 3.


здесь c не присваивается результату сравнения.Он содержит value read form File.

чтобы проверить результат сравнения, вам нужно следующее

int result = ((c = getchar ())!= EOF)

затем используйте результат, чтобы проверить это 0 или 1.

printf("%d",result);

У меня были тонны проблем с этой самой проблемой.

а также печатает "10", если я нажимаю клавишу возврата каретки.

кроме того, на странице 20 K&R указано, что значение ASCII для '\n' равно 10. Так, может быть, вы возвращаете эту ценность непреднамеренно?

каждый раз, когда я возвращаюсь к нему, я забываю, что ключ возврата кареты НЕТ EOF.

Как указывает пользователь Sayyora выше, вам нужна комбинация клавиш для сигнала ВФ.

для Linux это:

Ctrl + D

кроме того, чтобы убить программу (по крайней мере, в X-Term), это:

Ctrl + C


Я использую исходный файл C в DevC++ 4.9.9.2. Я новичок в программировании на C, и я использую K / R 2nd Ed. как мой проводник. После рассмотрения заявлений сверху я обнаружил, что следующие строки предоставили мне желаемый результат в Примере 1.6 / 1.7. Не стесняйтесь исправлять мое понимание, но, взяв на себя подсказку автора(ОВ) об использовании круглых скобок и печати как внутри, так и вне цикла while, можно получить результат 1 или 0. Последний getchar() является требованием Dev-C среда для удержания экрана ввода / вывода открытым для просмотра печатных заявлений.

main()
{
      int c; 
      while (c=getchar() !=EOF)
            printf("%d",c);
      printf("%d",c);
      getchar();      

// it will accept and print a single char, a word, a sentence...

while (c != EOF) {
  printf("\ngetchar()) != EOF) = %d -- ", ((c=getchar()) != EOF));
  putchar(c);
}

//the trick is to only call getchar() once per char and EOF value
//note: the last char is always char(10) which is invisible