вывод логического результата в C - PullRequest
0 голосов
/ 02 марта 2011

Я прочитал, что


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

напечатает значение 0 или 1 в зависимости от того, является ли следующий символ EOF или нет.Потому что! = Имеет более высокий приоритет, чем =.

Но когда я запускаю эту программу в gcc, я получаю символ, который выглядит как
| 0 0 |
| 0 1 |

как вывод, когда я нажимаю ввод.

Ответы [ 4 ]

6 голосов
/ 02 марта 2011

putchar печатает символ. При печати значений 0 и 1 вы печатаете символы null и начала заголовка (SOH), оба управляющих символа. Вам нужно будет преобразовать числа 0 и 1 во что-нибудь, что можно распечатать, либо путем вычисления значения для печати непосредственно из 0 или 1:

while (...) {
    // note: the C standard (§ 5.2.1-3 of C99) ensures '0'+1 is '1', which is printable
    putchar(c+'0');
}

или используйте c, чтобы решить, что печатать.

while (...) {
    if (c) {
        ...
    } else {
        ...
    }
    // or:
    //putchar(c ? ... : ...);
    // though feelings on the ternary operator vary.
}
1 голос
/ 02 марта 2011

Это то, что происходит в вашей программе

int c;

зарезервировать место для int (вызов этого пространства c) и не беспокоиться о его содержимом.

while(c = getchar( ) != EOF)

Элемент в скобках можно записать как c = (getchar( ) != EOF), поскольку оператор присваивания имеет более низкий приоритет, чем оператор неравенства.

  • getchar() ожидает нажатия клавиши и возвращает значение нажатой клавиши
  • Это значение проверяется по EOF
  • В отличие от этого, результат оператора неравенства равен 1
  • , а значение 1 помещается в пространство с именемc.

Затем внутри цикла while

{
   putchar(c);
}

вы печатаете символ со значением 1. Как вы заметили, на вашем компьютере персонажсо значением 1 не отображается красивый формат при отображении:)


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

c = 0; /* or 1 */
putchar('0' + c);

Если вы хотите напечатать значение от 0 до 9 как символпопробуйте это

c = 5; /* or 7, or 0, ... */
putchar('0' + c);
1 голос
/ 02 марта 2011

В дополнение к тому, что все говорили о том, что c является непечатаемым символом, вы в любом случае никогда не напечатаете 0 для EOF, поскольку в этом случае вы не собираетесь идти в цикл while. Вам понадобится дополнительный putchar после цикла.

1 голос
/ 02 марта 2011

Вы используете юникод-консоль.Все непечатаемые символы (например, байты со значениями 0 и 1) преобразуются в матрицу 2x2, отображающую ее значение в Юникоде.(Также для всех печатаемых символов, для которых не установлен шрифт)

...