/* * this demonstrated the use of the C preprocessor macro #define * * Matt Bishop, ECS 36A * * April 22, 2024 * first version */ #include <stdio.h> /* * macros */ /* a number */ #define NINE 9 /* side of a chessboard, with border rows and columns -- BAD */ #define SIDE 8+2 /* the above done right -- GOOD */ #define SIDE1 (8+2) /* common problem: expression that dupliocates a parameter */ /* and is passed an expression changing the value of a variable */ #define isbetween0and9(x) ((0 <= (x)) && ((x) <= 9)) /* * the program */ int main(void) { int x; /* used to show side effect in a macro */ /* show sides, including surrounding row and column */ printf("bad side = %d, good side = %d\n", SIDE, SIDE1); /* print number of squares in a chessboard two ways */ printf("chessboard with bad side has %d squares (wrong!)\n", SIDE * SIDE); printf("chessboard with good side has %d squares (right!)\n", SIDE1 * SIDE1); /* now set x for the side effect demo */ x = NINE; /* no side effect -- this is true, so print first printf */ if (isbetween0and9(x)) printf("%d is between 0 and 9\n", x); else printf("%d is not between 0 and 9\n", x); /* now side effect -- this is false, as (0 <= (x)) is true but */ /* now x i 10, so ((x) <= 9) is false; x incremeneted to 11 */ if (isbetween0and9(x++)) printf("%d is between 0 and 9\n", x); else printf("%d is not between 0 and 9\n", x); /* ta-ta for now */ return(0); }
|
ECS 36A, Programming & Problem Solving Version of April 2, 2024 at 12:13PM
|
You can get the raw source code here. |