【问题标题】:printing boolean result in C在 C 中打印布尔结果
【发布时间】:2011-03-02 13:34:20
【问题描述】:

我读到了


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

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

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

当我按下回车时作为输出。

【问题讨论】:

  • 我的理解是,由于首先发生不等式检查,因此变量 c 应该得到值 0,这相当于 false。

标签: c boolean operator-precedence


【解决方案1】:

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.
}

【讨论】:

  • 为了可读性,你可以把它变成一个宏:#define BOOL_TO_ASCII(c) ((c) ? '1' : '0')
  • '0' + 1'1'。 C 标准要求所有数字从 '0' 到 '9' 是连续的。信件没有这样的保证。
  • @pmg:我没有意识到这一点。很高兴知道。
  • @Santiago:对宏的感受也各不相同。
  • 字符值是数字,在 C 中('char' 是一个整数类型,大到足以存储基本字符集的成员)和 ASCII(将数字代码点和字符相关联)。 char 与 C 中其他数字类型的区别在于 char 具有特殊的显示语义。此外,编码不需要是 ASCII;它是平台使用的任何东西(putchar 只是将字符写入流,不关心流对它的作用)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    除了每个人都说c 是一个不可打印的字符之外,你永远不会为EOF 打印出0,因为在这种情况下你不会进入while 循环。在循环之后你需要一个额外的putchar

    【讨论】:

    • 是的。但这就是问题所在。我在终端(在 Ubuntu 中)中运行程序。按 Ctrl+C 是发送 EOF 值的唯一方法。但是程序立即退出,我该如何打印呢??
    • 查看此答案以获取更多信息stackoverflow.com/questions/1793616/…
    【解决方案4】:

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

    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);
    

    【讨论】:

    • getchar() 很少返回 EOF。当它返回常规值时,它们是不同的,并且条件(getchar() != EOF)为真。
    • 哦...是的,我的错误。这是真的。
    • 我正在终端中运行程序。所以 ctrl+C 是发送 EOF 的方式,对吧?但是我的程序也退出了。那么我们如何打印最后一个 false 值。
    • @John:您在 *nix 中使用 Ctrl+D 发送 EOF,在 Windows 中使用 Ctrl+ZCtrl+C 在两种环境中都发送“退出”信号:难怪程序退出 :)
    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多