为什么我可以将char与int进行比较?

时间:2018-02-02 07:38:26

标签: c type-promotion

我对C不太熟悉所以我对语言的类型安全感到有点困惑。

例如。

char* my_pointer;

my_pointer = malloc(sizeof(char));

if (*my_pointer == 0b0000)
{
    // this might be true or false, doesn't matter
}

代码如何运行?为什么它只是在*my_pointer == 0b0000爆炸?

不应该*my_pointer返回一个字符吗?

从技术角度来说,只有像*my_pointer == 'a'这样的人能够工作吗?

3 个答案:

答案 0 :(得分:3)

C语言没有专用的“字符”类型,其中包含一些独立的“仅字符”语义。 char只是C中的另一个整数类型,就像shortint一样。它恰好是最小的整数类型。您可以使用char进行整数算术计算,就像使用任何其他整数类型一样(尽管在该角色中使用char并不是一个好主意)。

比较charint时,您只需比较两个整数值。没什么不寻常的。

整数提升规则表示char隐式转换为int(假设范围适合),然后比较两个int值。

您的*my_pointer == 'a'示例实际上与原始示例没有什么不同。在C 'a'中是一个字符常量,表示类型int的整数值。即我们甚至无需将'a'提升为int,因为它已经是int

答案 1 :(得分:1)

首先,0b不是整数常量的有效标准C前缀。因此,您需要确保遵循所使用平台的具体细节。

话虽如此,根据Equality运算符(==)的规则,算术转换(整数提升)规则适用于操作数,如果两者都是算术类型的话。

引用C11,章节§6.5.9,

  

如果两个操作数都有算术类型,则通常的算术转换是   执行。 [...]

答案 2 :(得分:0)

您只是比较2个整数值。这是因为0b0000是一个整数字面值,解除引用my_pointer后得到的值将被提升为int。

  

如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int

相关问题