>>25U NEED TO INCLUDE <stdbool.h> IF U WANT TO USE DA bool TYPE.
AS 4 UR MISUNDERSTANDING OF SEQUENCE POINTS, CONSIDER DIS:
int c = 23;
1 && (c = 24);
IN DIS CASE 24 IS STORED IN c. "1" IS EVALUATED N, BECOS "1" EVALUATES TRUTHFULLY, "(c = 24)" IS EVALUATED AFTER.
int c = 23;
0 && (c = 24);
IN DIS CASE 23 IS STORED IN c AND "(c = 24)" ISN'T EVALUATED, COS DA FIRST PART EVALUATES FALSELY.
IF WE SHIFT DIS OVER TO UR IMPLEMENTATION ...
int c = 23;
and(0, c = 24);
WE'LL FIND DAT 24 IS STORED IN c, EVEN THO DA FIRST PART OF DA EXPRESSION IS ZERO. DIS IS BECAUSE ALL OF DA ARGUMENTS TO and ARE EVALUATED BEFORE DA FUNCTION CALL IS MADE.
WITH DIS IN MIND, U SHUD REALISE DAT U CAN'T IMPLEMENT DESE OPERATORS AS FUNCTIONS. U CAN, HOWEVER, IMPLEMENT DEM AS MACROS, IN TERMS OF DA ?: OPERATOR ...
#define AND(a, b) ((a) ? !!(b) : 0)
?:, LIKE &&, INTRODUCES A SEQUENCE POINT. DA FIRST PART IS EVALUATED, IF IT'S TRUE DA SECOND PART IS EVALUATED, OTHERWISE DA THIRD PART IS EVALUATED.
FOR THOSE OF U WHO CODE IN LISP ALL DAY LONG, DIS CAN ACTUALLY BE SOMEWHAT USEFUL (THO A BIT CONFUSING FOR THOSE UNFAMILIAR) 4 DEFINING LISP-LIKE 'AND' SYNTAX:
#define AND(a, b) ((a) ? (b) : 0)
const char *s;
int c;
c = AND(1, 69);
/* c stores 69. */
c = AND(0, 69);
/* c stores 0. */
s = AND(1, "abc");
/* s stores a pointer to the first element of "abc". */
s = AND(0, "abc");
/* s stores a null pointer. */