Есть ли какой-либо Идентичный оператор === в C, как в PHP?

В 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, это задача программиста сравнивать только те же переменные типа, что и вы должны явно объявить их.