Consider the following macro: 

```
#define FOO(a,b) (--a)* 8 + (--b);

```

Now 

```
int graph[8][8] = { 0 };
int *graph_p = &(graph[0][0]);
int *p = graph_p + FOO(2, 3);

```

Why do I get the error:

> 
> IntelliSense: expression must be a modifiable lvalue
> 
> 
>
['https://Stackoverflow.com/questions/32011014', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/5211135/']
It's because you are passing an *integer constant* to function-like macro `FOO(a, b)`, that applies pre-increment `--` operator to its arguments.

The result of this macro expansion looks as:

```
int *p = graph_p + (--2)* 8 + (--3);;

```

which is illegal in C, as operator requires a *modifiable lvalue* as its operand.

Another issues here are, that you should put parantheses around macro's replacement and do not place semicolon at the end:

```
#define FOO(a,b) ((--a)* 8 + (--b))

```
The line 

```
int *p = graph_p + FOO(2, 3);  

```

will be replaced at compile time by the defined macro as 

```
int *p = graph_p + (--2)* 8 + (--3);; 

```

the operand of prefix `--` must be an lvalue. `2` and `3` are integer constants and it can't be an operand of prefix `--` operator.