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

Posted

技术标签:

【中文标题】为啥我得到的表达式必须是可修改的左值?【英文标题】:Why do I get expression must be a modifiable lvalue?为什么我得到的表达式必须是可修改的左值? 【发布时间】:2015-08-14 13:15:10 【问题描述】:

考虑以下宏:

#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:表达式必须是可修改的左值

【问题讨论】:

因为 FOO(2, 3); 扩展为 (--2)* 8 + (--3); — 您不能将预减运算符应用于常量整数值 如果你增加(即修改)一个整数常量,你认为会发生什么? 好的...谢谢大家! 不要编写讨厌的函数式宏,所有问题都会迎刃而解。 【参考方案1】:

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

这个宏展开的结果如下:

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

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

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

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

【讨论】:

【参考方案2】:

线

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

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

试试这个:

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

【讨论】:

以上是关于为啥我得到的表达式必须是可修改的左值?的主要内容,如果未能解决你的问题,请参考以下文章

指向函数指针的指针 - 表达式必须是可修改的左值

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

C++ 表达式必须是可修改的左值

表达式必须是可修改的左值(字符数组)

循环中分配的多维数组说明:表达式必须是可修改的左值

C++的结构体指针中出错:表达式必须是可修改的左值_最后发现解决方法很简单