在C中打印布尔结果

时间:2011-03-02 13:34:20

标签: c boolean operator-precedence

我读了那个


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

将根据下一个字符是否为EOF打印值0或1。因为!=的优先级高于=。

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

输入时按

输出。

4 个答案:

答案 0 :(得分:6)

putchar打印一个角色。通过打印值0和1,您将打印nullstart of heading(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 :(得分:1)

您正在使用unicode-console。所有不可打印的字符(如值为0和1的字节)将转换为显示其unicode值的2x2矩阵。 (另外,对于没有安装任何字体的所有可打印字符)

答案 2 :(得分:1)

除了大家都说c是一个不可打印的角色之外,你永远不会为0打印EOF,因为你不打算进入在这种情况下循环。循环后你需要额外的putchar

答案 3 :(得分:1)

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

int c;

int预留空间(称之为空格c)并且不要担心其内容。

while(c = getchar( ) != EOF)

括号中的东西可以写成c = (getchar( ) != EOF),因为赋值运算符的优先级低于不等式运算符。

  • getchar()等待按键并返回按下的键的值
  • 根据EOF检查该值
  • 因为它不同,不等式运算符的结果是1
  • 并将值1放入名称为c的空间。

然后,在while循环中

{
   putchar(c);
}

您正在打印具有值1的字符。正如您所注意到的,在您的计算机上,值为1的字符在显示时没有漂亮的格式:)


如果您确实要打印具有漂亮格式的值01,请尝试使用

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

如果要将0到9之间的值打印为字符,请尝试使用

c = 5; /* or 7, or 0, ... */
putchar('0' + c);