【问题标题】:How come I can compare a char with an int? [duplicate]为什么我可以将 char 与 int 进行比较? [复制]
【发布时间】:2018-07-12 16:06:41
【问题描述】:

我对 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' 这样的东西能够工作吗?

【问题讨论】:

  • 当你取消引用 my_pointer 时你会得到一个 char,但随后它被提升为 int 与其他值一样
  • @martin 哇,我想你可能正在做点什么。不幸的是,由于我是 C 的菜鸟,也许对您提到的内容进行更深入的解释是我很乐意接受的答案。
  • 标准 C 规则在这里不适用,因为二进制整数常量 0b0000 不是语言的一部分。
  • SO 不能代替初学者的课程。你应该拿一本 C 教科书,了解基本类型和转换规则。

标签: c type-promotion


【解决方案1】:

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

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

整数提升的规则表明char 被隐式转换为int(只要范围适合),然后比较两个int 值。

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

【讨论】:

  • C 中的所有内置变量类型是否都会进行整数提升?
  • @AlanSTACK:在语言规范规定应该发生的情况下,小整数类型 [signed/unsigned] char[signed/unsigned] short 会发生整数提升。运算符== 恰好是这样的上下文之一。
【解决方案2】:

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

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

引用C11,第 6.5.9 章,

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

【讨论】:

    【解决方案3】:

    您只是在比较 2 个整数值。发生这种情况是因为 0b0000 是一个整数文字,并且您在取消引用 my_pointer 后获得的值被提升为 int。

    如果一个int可以表示原始类型的所有值,则将该值转换为一个int;否则,将其转换为无符号整数

    【讨论】:

      猜你喜欢
      • 2014-05-17
      • 2012-04-29
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多