为什么我得到表达式必须是可修改的左值?

时间:2015-08-14 13:15:10

标签: c pointers

考虑以下宏:

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

现在

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

为什么我会收到错误:

  

IntelliSense:表达式必须是可修改的左值

4 个答案:

答案 0 :(得分:2)

该行

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

将在编译时被定义的宏替换为

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

前缀--的操作数必须是左值。 23是整数常量,它不能是前缀--运算符的操作数。

答案 1 :(得分:2)

这是因为您将整数常量传递给类似函数的宏FOO(a, b),它将预增量--运算符应用于其参数。

此宏扩展的结果如下:

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

在C中是非法的,因为运算符需要可修改的左值作为其操作数。

这里的另一个问题是,您应该在宏的替换周围放置parantheses而不要在末尾放置分号:

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

答案 2 :(得分:1)

FOO(2,3)转换为(--2)* 8 + (--3)

您只能增加/减少左值,而不是数字。

答案 3 :(得分:1)

试试这个:

Int * p=(int * )(graph-p+FOO(2,3));