Есть ли такой же оператор === в C, как в PHP?

В PHP, Идентичный Операптр (===), возвращает TRUE если обе стороны абсолютно равны, и они одного типа.

Есть ли что-то подобное в С Мир?

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 🙂

3

Другие решения

Я не понимаю, почему вам нужно использовать такую ​​функцию в C или Java, это задача программиста — сравнивать только переменные одного типа, так как вы должны явно объявить их.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector