在C语言中有没有bool类型的格式说明符?

12
在下面的例子中,我试图扫描一个布尔类型变量的值。当我在GCC编译时,我得到以下警告:
warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘_Bool *’ [-Wformat=]
  scanf("%d", &b);

代码:

#include <stdio.h>
#include <stdbool.h>

int main()
{
    bool b;

    scanf("%d", &b);
    printf("%d\n", b);
}

在C语言中有布尔类型的格式说明符吗?

8
没有一个单一的选择。作为替代方案,您可能想使用 printf("%s\n", b ? "true" : "false"); - Grzegorz Szpetkowski
这并不是完全重复,因为这是关于打印的,而https://dev59.com/Nmcs5IYBdhLWcg3wXSuU是关于`scanf()`的。但我想还是足够好了。 :) - unwind
@unwind: 你说得对。我会重新打开并表示歉意。现在是挖掘C标准的时候了。 - Bathsheba
1
我甚至不确定应用程序输入/输出原始布尔值是否有意义,除了调试目的之外。布尔值总是代表某些东西,用户只对该事物感兴趣。提示用户输入的内容可能是“继续(y/n)?”,在这种情况下,输入将是字符或其他内容。您不会提示用户“假定您想要继续”,然后他们会键入“true” / “false”。即使您这样做,仍然不会使用布尔类型。 - Lundin
@Lundin:我完全同意。我甚至认为将 bool-stuff 引入 C 语言是一个错误。 - Bathsheba
显示剩余3条评论
2个回答

6

C语言中没有针对bool类型的格式说明符。

在使用printf时,您可以依赖隐式提升为int,并使用%d作为指定的格式化程序。

在使用scanf时,您应该将其读入int,并进行适当的转换。同样,使用%d


-6

C语言中没有bool类型的特定说明符。 如果需要,你应该在printf()函数中进行强制类型转换以避免警告。

但是并没有专门用于表示bool类型的格式说明符。

尝试下面的方法以避免scanf()函数的警告:

scanf("%d", (int*)&b)

bool 是否一定与 int 大小相同?否则 (int*)&b 对我来说看起来不安全。 - Martin R
不是必须的,通常bool(并非每次)的大小为1字节,这只是为了警告而已。 - Stubborn
1
但是,scanf将在该位置存储一个int大小的值,因此行为是未定义的。 - Martin R
那么转换方法将始终存在。 - Stubborn
3
因为建议使用scanf("%d",(int*)&b),这是明显的未定义行为,所以被踩了。 - user694733
1
它可能在gcc上看起来可以工作。这就是未定义行为的可怕之处。它可能在下一次运行或编译后不起作用。或者它可能有无关的副作用,比如在程序的其他地方损坏内存。或者其他什么。C标准非常清楚地说明这是非法使用,但不幸的是,强制转换禁用了编译器可能给出的任何警告。仅仅进行测试并不足以确定在C中某些东西是否合法。 - user694733

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接