【问题标题】:C boolean valueC 布尔值
【发布时间】:2013-05-05 08:20:55
【问题描述】:

作为this问题的答案,

发生的事情正是你所说的,!= 的优先级 高于=。

这意味着 != 比 = 更难绑定,并且

while(inp = getchar() != EOF) {

等价于;

while(inp = (getchar() != EOF)) {

这会将 inp 设置为比较的布尔值,而不是 您正在寻找的字符值。

这个答案被认为是真实的。但是,有一部分让我很困惑,最后一句话:

这会将 inp 设置为比较的布尔值,而不是 您正在寻找的字符值。

在这里,如果 inp 设置了一个 bool 值(我相信这是真的),为什么我们在使用 putchar(inp) 时看不到该值?为什么我们在屏幕上看不到 0 或 1?


问题:

在 The C Programming Language, 2nd Edition 的第 17 页中,作者说

The precedence of != is higher than that of =

所以当我想测试它时,它不是那样的。这是我的简单程序:

#include <stdio.h>

int main() {
    int inp;

    while(inp = getchar() != EOF) {
        putchar(inp);
    }
}

我尝试读取输入并将其显示给用户。当我尝试时,什么也没有发生,屏幕是空的,但是当我尝试这个时,一切正常:

#include <stdio.h>

int main() {
    int inp;

    while((inp = getchar()) != EOF) {
        putchar(inp);
    }

}

怎么了?我有 gcc 版本 4.2.1(基于 Apple Inc. build 5658)(LLVM build 2336.11.00)。

【问题讨论】:

  • 值0 和1 的字符在显示屏上不可见。试试putchar(inp + '0'); 或printf("%02X", inp);
  • 它将输出字符 SOH,其 ascii(或其他当前系统区域设置编码)值为 1(不可打印的字符)取决于您正在运行的控制台,您可能什么也得不到或垃圾字符。
  • 当我使用 putchar(inp + '0'); 和 printf("%02X", inp); 时得到 11选项,我得到 0101。
  • @ErcanOzturk 在格式字符串printf("%02X\n", inp); 中输入一个换行符,您可能会看到它在每次迭代时打印“01”(字符的ascii 代码)。
  • 是的,当我使用 printf("%02X\n", inp); 时,它会打印 01;当我输入 EOF 时,它什么也不打印(只是一个空行)。

标签: c boolean


【解决方案1】:

在这里,如果 inp 设置了一个 bool 值(我相信这是真的),为什么我们在使用 putchar(inp) 时看不到该值?为什么我们在屏幕上看不到 0 或 1?

因为字符代码 0 和 1 在您的系统语言环境中显然不是可打印的字符。 0 和 '0' 是不同的。

【讨论】:

  • 确实,字符 0 保证是 nul 终止符 - 所以即使它是“可打印”的,因为打印它会在终端上发生某些事情,它永远不是字母/数字/等等。
  • 我使用了printf("%d", inp);,但是当它不是EOF时它打印11而不是0,当它是时它打印1。假值的int等价于11,为什么不是 0?
  • @ErcanOzturk 为什么你认为EOF 是整数0?不是...另外,您似乎将getchar() 的返回值与getchar() != EOF 表达式的值混淆了。
  • getchar() != EOF 返回一个布尔值,无论如何,我在这里得到了“可打印”点。谢谢@Steve 和@H2CO3!
【解决方案2】:

在这里,如果将 inp 设置为布尔值(我相信这是真的),为什么 使用 putchar(inp) 时看不到值吗?为什么我们看不到 0 或 1 在屏幕上?

它不是'1' 或'0'(整数值48 和49,ASCII 格式)。它是一个整数值 1 或 0('\1' 或 '\0')。

printf("%d\n", '0'); /* prints the integer value of '0', followed by newline */
printf("%c\n", '0'); /* prints '0', followed by newline */

printf("%d\n", 0); /* prints '0', followed by newline */
printf("%c\n", 0); /* prints '\0' (null terminator), followed by newline */

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 2011-03-28
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多