为啥我得到的表达式必须是可修改的左值?
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);;
前缀--
的操作数必须是左值。 2
和 3
是整数常量,不能是前缀 --
运算符的操作数。
【讨论】:
【参考方案3】:FOO(2,3)
转换为 (--2)* 8 + (--3)
你只能增加/减少一个左值,而不是一个数字。
【讨论】:
【参考方案4】:试试这个:
Int * p=(int * )(graph-p+FOO(2,3));
【讨论】:
以上是关于为啥我得到的表达式必须是可修改的左值?的主要内容,如果未能解决你的问题,请参考以下文章