Question: When you see a line like:

```
#define IX(i,j) ((i)+(N+2)*(j))

```

is that equivalent to:

```
int IX(int i, int j) {

    return ((i)+(N+2)*(j));

}

```

How do you know the return type etc?

Answer: 
`#defines` are preprocessor commands. When the code is compiled, IX(i,j) is replaced with its definition everywhere it occurs. You can think of it as a copy-paste operation. Because this happens while the code is being compiled, IX(i,j) returns no type. This lack of type safety is both a feature and a drawback, use it carefully.
All the answers are correct.

Since macros are handled by the preprocessor before the compiler translates the code to machine instructions they can have the interesting side effects others have mentioned.

I don't entirely agree with the statement that macros reduce code understandability. I think if they are used cautiously, intelligently, and are provably correct they can lead to more understandable (dare I say it?) self-documenting code.

Example:

```
#define MAX(N1,N2) ((N1) > (N2) ? (N1) : N2))
biggest = MAX(temperatureOne, temperatureTwo);

```

Yes, I know that MAX(x++, y) would have undesirable side effects but that's where the intelligent use comes in.