像PHP中那样,在C中是否有相同的运算符===? [英] Is there any Identical operator === in C like that in PHP?

查看:63
本文介绍了像PHP中那样,在C中是否有相同的运算符===?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

C 世界上有类似的东西吗?

解决方案

在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语言类型系统的绝佳方法:)

In PHP, the Identical Operatpr (===), returns TRUE if both sides are exactly equal, and they are of the same type.

Is there any similar thing in C world?

解决方案

With C11 _Generic available, your question made me want to invent one.

Basically you can implement this with a macro such as this:

#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:)

Which can get turned into an easy-to-maintain, hard-to-read X macro list:

#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)

Working example:

#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');
}

Output

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'

Excellent way to experiment with (and cringe over) the C language type system :)

这篇关于像PHP中那样,在C中是否有相同的运算符===?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆