【问题标题】: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); — 您不能将预减运算符应用于常量整数值
  • 如果你增加(即修改)一个整数常量,你认为会发生什么?
  • 好的...谢谢大家!
  • 不要编写讨厌的函数式宏,所有问题都会迎刃而解。

标签: c pointers


【解决方案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));
        

        【讨论】:

          猜你喜欢
          • 2020-07-07
          • 1970-01-01
          • 2021-09-17
          • 2014-12-15
          • 2014-12-20
          • 2015-09-19
          • 2016-05-09
          • 2016-09-13
          • 1970-01-01
          相关资源
          最近更新 更多