在 C 中打印布尔结果

问题描述 投票:0回答:4

我读到了

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

将根据下一个字符是否为 EOF 来打印值 0 或 1。因为

!=
的优先级高于
=

但是当我在 GCC 中运行这个程序时,我得到一个看起来像这样的字符

|0 0|
|0 1|

作为我按 Enter 时的输出。

c boolean operator-precedence
4个回答
6
投票

putchar
打印一个字符。通过打印值 0 和 1,您将打印 nullstart of header (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
投票

您正在使用 unicode 控制台。所有不可打印的字符(例如值为 0 和 1 的字节)都会转换为显示其 unicode 值的 2x2 矩阵。 (此外,对于所有未安装字体的可打印字符)


1
投票

除了每个人都说

c
是不可打印字符之外,无论如何你都不会为
0
打印出
EOF
,因为在这种情况下你不会进入 while 循环。循环后您需要额外的
putchar


1
投票

这就是你的程序中发生的事情

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);
© www.soinside.com 2019 - 2024. All rights reserved.