В PHP идентификатор Operatpr ( ===
) возвращает TRUE
если обе стороны точно равны, и они одного типа.
Есть ли что-то подобное в мире С ?
С доступным 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 🙂
Я не понимаю, зачем вам нужно использовать такую функцию в C или java, это задача программиста сравнивать только те же переменные типа, что и вы должны явно объявить их.