【问题标题】:how does less than (<) operator work with mixed types in c小于 (<) 运算符如何处理 c 中的混合类型
【发布时间】:2010-01-13 15:47:12
【问题描述】:

有人能解释一下小于运算在 C 中是如何工作的吗?

特别是当左侧和右侧操作数的类型不同时它是如何工作的?

它是根据第一个还是第二个的类型来比较它们?

【问题讨论】:

    标签: c comparison types operators


    【解决方案1】:

    C 指定不同类型的标准转换。规则有点复杂,但基本上“较小”的类型会暂时转换为较大的类型,因此如果将 int 与 char 进行比较,char 将转换为 int,仅用于比较。

    【讨论】:

    • 这方面的术语是“通常的算术转换”,您可以在 Kernighan 和 Ritchie 的 C 编程语言 的索引中找到它。令人惊讶的是,有时一个有符号操作数会被提升为无符号类型,因为另一个操作数是无符号的,因此一个大的正数 unsigned int 可能被认为小于负数 int
    • 另一条规则是,永远不会对小于 int 的类型进行算术运算(包括比较),因此如果您将 charchar 进行比较,它们会 晋升为int
    【解决方案2】:

    根据 C99 标准,任何关系运算符都允许以下操作数:

    • 两个具有实数算术类型的操作数
    • 两个指向相同类型对象的指针

    前一种情况,不同的类型会根据usual arithmetic conversions进行转换。

    【讨论】:

      【解决方案3】:

      就像 Jason 在其中一个 cmets 中所说,您必须小心使用无符号类型。例如下面的代码打印出 BROKEN:

      #include <stdio.h>
      
      int main() {
        int a = -1;
        unsigned int b = 1 << 31;
      
        if (a < b) {
          fprintf(stderr, "CORRECT\n");
        } else {
          fprintf(stderr, "BROKEN\n");
        }
      
        return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-08-27
        • 1970-01-01
        • 2017-08-26
        • 2012-10-28
        • 2022-11-11
        • 2019-05-14
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        相关资源
        最近更新 更多