我对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'
这样的人能够工作吗?
答案 0 :(得分:3)
C语言没有专用的“字符”类型,其中包含一些独立的“仅字符”语义。 char
只是C中的另一个整数类型,就像short
或int
一样。它恰好是最小的整数类型。您可以使用char
进行整数算术计算,就像使用任何其他整数类型一样(尽管在该角色中使用char
并不是一个好主意)。
比较char
和int
时,您只需比较两个整数值。没什么不寻常的。
整数提升规则表示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