【问题标题】:Strict comparaison between char and intchar和int之间的严格比较
【发布时间】:2013-05-10 13:24:27
【问题描述】:

我想知道是否可以比较整数和字符。 可能是 Javascript 中的“===”。 因为

'a' == 97

会输出

1

编辑:我想要类似的东西

compare('a', 97)

会输出什么

0

我该怎么办?

谢谢

【问题讨论】:

  • 问题是'a'的类型也是int。如果源字符集与 ASCII 不兼容,则只能区分 'a'97
  • No 'a' 不是 int。检查 sizeof(char) 和 sizeof(int)a
  • 好吧,char 的大小和 int 的大小通常是不同的(虽然不能保证),但整数字符常量在 C 中的类型为 int。试试 @ 987654332@.
  • "整数字符常量的类型为int。包含映射到单字节执行字符的单个字符的整数字符常量的值是映射字符表示的数值解释为整数。包含多个字符(例如,'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的。
  • @Extaze 是的,标准明确规定 An integer character constant has type int.(第 10 段,§6.4.4.4)

标签: c char int equals strict


【解决方案1】:

是的,这是可能的。不仅char 只是另一个整数类型,而且'a' 实际上本身就是int 类型的文字。所以'a' == 97 是一个完全有效的逻辑表达式。它的值是实现定义的。

【讨论】:

  • 我认为 OP 是在询问如何检查 'a'97 是否是同一个对象。如果它们不属于同一类型,则严格比较将返回 false
  • @Blender:它们都是临时值,所以它们不能是“同一个对象”,不超过2 == 2。事实上,由于操作数不是左值,我认为问“它们是否是同一个对象”是没有意义的。
  • @KerrekSB:我已经在我的回答中解决了这个问题,尽管我仍然不完全确定这是否是 OP 所要求的......
  • @Blender:让我把这个更正式一点:对象标识是按地址和类型(即两个对象是相同的当且仅当它们具有相同的地址和相同的类型)。由于只有左值可以有地址,所以只有左值可以有标识。
  • @Blender:关于我的最后一点,我想说 C 和 C++ 有大量 基于值的 语言(甚至 C++ 更是如此),以及这个概念对象标识在它们中并不是那么有用。价值平等是一种更为惯用的关系。基本上是引用语义的语言有非常不同的习语(例如,有一个不可触及的整数“2”,所有变量都只是对它的引用)。
【解决方案2】:

'a'97 是值,而不是对象,因此询问它们是否是同一个对象是没有意义的。如果您将这些值存储在对象中并且有指向这些对象的指针,您将比较这些指针。

另一方面,如果您希望通过比较来区分 'a'char97int,那么您也很不走运。在 C 中,'a'int,而不是 char

【讨论】:

  • 检查 sizeof(char) 和 sizeof(int)
  • @Extaze 查看sizeof('a')sizeof(97)'a' 首先不是 char。所以说sizeof(char)sizeof(int) 不同,这不是一个公平的比较;)
【解决方案3】:

在 C 语言中(与 PHP 不同),您在编译时就知道变量的类型是 char 还是 int,因此使用 ===== 运算符是没有意义的。

我想要类似的东西 比较('a', 97)

这是一个函数吗?如果是这样,则参数的类型在编译时是固定的,因此您无法实现它,并且无论如何调用该函数是没有意义的。你知道,在编译时,参数是否相同。

此外,如果我们有

 c = (char)40;
 i = 40;

compare(c,i) 应该返回什么?

也许你能给我们一些动力,你为什么认为你需要这样的功能?

您可以编写一个宏,在 == 之前放置一个 sizeof() 比较,但是,这不会区分相同大小的不同类型,而且同样没有多大意义。

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多