(Упражнение 1.6 K&R) как верфий, что getchar ()!= EOF РАВНО 0 ИЛИ 1?
Я только начал изучать Программирование (C) в качестве хобби, самостоятельно. Я с помощью K&Р.
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
убедитесь, что getchar() != EOF РАВНО 0 ИЛИ 1
кажется, я понимаю, что происходит:
- C присваивается следующий символ с клавиатуры
- C проверяется, является ли это EOF или нет
- c присваивается 1 или 0, в зависимости от того, является ли это EOF или нет.
- отображается символ на выходе, или если 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