gpt4 book ai didi

php - C 中是否有与 PHP 中相同的运算符 ===?

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:00 26 4
gpt4 key购买 nike

PHP 中,Identical 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 语言类型系统的绝佳方式:)

关于php - C 中是否有与 PHP 中相同的运算符 ===?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42434485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com