【问题标题】:Is there any Identical operator === in C like that in PHP?在 C 中是否有任何相同的运算符 === 像 PHP 中的那样?
【发布时间】:2017-02-24 08:59:31
【问题描述】:

PHP 中,Identical Operatpr (===) 如果两边完全相等且属于同一类型,则返回 TRUE。 p>

C世界有没有类似的东西?

【问题讨论】:

  • 为什么不用 python、perl 和 ruby​​?
  • 在java中你不能一次检查值和数据类型。您必须为它编写自己的方法
  • 在java中你可以这样使用:- new String("test").equals("test") // --> true
  • 没有。 PHP 是一种弱类型语言,您提到的语言都是强类型语言,因此这些语言中的所有比较都将像 PHP 中的 === 一样工作。
  • @GordonM 不,他们当然不会。

标签: php c operators equality


【解决方案1】:

C11 _Generic 可用,你的问题让我想发明一个。

基本上你可以用这样的宏来实现它:

#define is_truly_equal(a, b) \
  _Generic((a), \
           int:    _Generic((b), int: (a) == (b),   default: 0), \
           short:  _Generic((b), short: (a) == (b), default: 0), \
           default 0:)

这可以变成一个易于维护、难以阅读的 X 宏列表:

#define TYPE_LIST(a,b)  \
  X(a,b,int)            \
  X(a,b,unsigned int)   \
  X(a,b,short)          \
  X(a,b,unsigned short) \
  X(a,b,char)           \
  X(a,b,signed char)    \
  X(a,b,unsigned char)  \
  X(a,b,float)          \
  X(a,b,double)

#define X(a,b,type) type: _Generic((b), type: (a) == (b), default: 0),
#define is_truly_equal(a, b) _Generic((a), TYPE_LIST(a,b) default: 0)

工作示例:

#include <stdio.h>

#define TYPE_LIST(a,b)  \
  X(a,b,int)            \
  X(a,b,unsigned int)   \
  X(a,b,short)          \
  X(a,b,unsigned short) \
  X(a,b,char)           \
  X(a,b,signed char)    \
  X(a,b,unsigned char)  \
  X(a,b,float)          \
  X(a,b,double)

#define X(a,b,type) type: _Generic((b), type: (a) == (b), default: 0),
#define is_truly_equal(a, b) _Generic((a), TYPE_LIST(a,b) default: 0)

inline void print_equal (_Bool is_equal)
{
  is_equal ? 
  printf("equal:     ") : 
  printf("not equal: ");
}

#define print_expr(p1, p2) print_equal( is_truly_equal(p1, p2) ); printf(#p1 ", " #p2 "\n")

int main (void)
{
  print_expr(1,1);
  print_expr(1,2);
  print_expr(1,1u);
  print_expr(1, (short)1);

  print_expr((signed char)'A',   (char)'A');
  print_expr((unsigned char)'A', (char)'A');
  print_expr('A', 65);
  print_expr('A',  (char)'A');
  print_expr('A', +(char)'A');
}

输出

equal:     1, 1
not equal: 1, 2
not equal: 1, 1u
not equal: 1, (short)1
not equal: (signed char)'A', (char)'A'
not equal: (unsigned char)'A', (char)'A'
equal:     'A', 65
not equal: 'A', (char)'A'
equal:     'A', +(char)'A'

试验(和畏惧)C 语言类型系统的绝佳方式:)

【讨论】:

    【解决方案2】:

    我不明白你为什么需要在 C 或 java 中使用这样的函数,程序员的工作是只比较相同类型的变量,因为你必须显式声明它们。

    【讨论】:

    • 如果程序员不了解 C 中众多、微妙、不合理的类型规则中的每一个怎么办?我敢说大多数 C 程序员没有。
    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2019-06-17
    • 2011-05-06
    • 2012-09-03
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多