我怎么能把char和int进行比较呢?
我对C不是很熟悉,所以我对语言的类型安全性有点困惑 比如说我怎么能把char和int进行比较呢?,c,type-promotion,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=='
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=='a'
这样的东西才能工作?C语言没有一个专用的“字符”类型,并带有一些孤立的“仅字符”语义char
只是C中的另一种整数类型,就像,short
或int
一样。它恰好是最小的整数类型。您可以使用char
进行整数算术计算,就像使用任何其他整数类型一样(尽管在该角色中使用char
不是一个好主意)
当您比较char
和int
时,您只是比较两个整数值。没什么不寻常的
整数提升规则规定,char
隐式转换为int
(如果范围合适),然后比较两个int
值
您的*my_pointer=='a'
示例实际上与您原来的示例没有什么不同。在C中,“a”是一个字符常量,它表示类型为int
的整数值。也就是说,甚至没有必要将'a'
提升为int
,因为它已经是int
首先,0b
不是整数常量的有效标准C前缀。因此,您需要确保遵循所使用平台的具体说明
也就是说,根据等式运算符(=
)的规则,算术转换(整数提升)规则适用于操作数,前提是它们都是算术类型
引用C11
,第§6.5.9章
如果两个操作数都具有算术类型,则通常的算术转换为
表演。[……]
您只需比较两个整数值。发生这种情况是因为0b0000
是一个整数文本,并且在取消引用my_指针
后得到的值将被提升为int
如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为无符号整数
当您取消引用my_指针时,会得到一个char,但随后它会被提升为int,其他指针也一样value@martin哇,我想你可能知道些什么。不幸的是,由于我是C语言的新手,也许对你提到的问题有一个更深入的解释,我很乐意接受。标准C规则在这里不适用,因为二进制整数常量0b0000
不是语言的一部分。因此不能代替初学者的课程。你应该读一本C教科书,了解基本类型和转换规则。C中所有内置变量类型都会进行整数提升吗?@AlanSTACK:integer提升发生在小整数类型[signed/unsigned]char
和[signed/unsigned]short
在语言规范规定应该发生的上下文中。运算符==
恰好就是这样的上下文之一。