【问题标题】:lvalue required as left operand of assignment in some old c code在一些旧的 c 代码中需要左值作为赋值的左操作数
【发布时间】:2013-12-14 09:37:22
【问题描述】:

为什么下面代码的第二行会抛出 C 错误:lvalue required as left operand of assignment

  if (!str_cmp( type, "obj")){
    if ( ((OBJ_DATA*) tar = get_obj_here( NULL, room, target)) == NULL){
      bug("prog_destroy: obj target not found.", 0);
      return;
    }
    else{
      list = (OBJ_DATA*) tar;
      list = list->contains;
    }
  }

【问题讨论】:

    标签: c


    【解决方案1】:

    您不能对作业的 LHS 进行投射。 IE。 (OBJ_DATA*) tar 不允许在第二行。

    您可以尝试声明OBJ_DATA * tar = NULL; 然后将其用作

    tar = get_obj_here( NULL, room, target)
    

    tar =(OBJ_DATA*) get_obj_here( NULL, room, target)
    

    取决于get_obj_here() 返回的内容。

    【讨论】:

    【解决方案2】:

    强制转换会产生 r 值。它不能在= 运算符的左侧(l 值)上完成。

    if ( ((OBJ_DATA*) tar = get_obj_here( NULL, room, target)) == NULL)  
            ^
            |
       Remove this data type
    

    【讨论】:

      【解决方案3】:

      我认为这是代码中的错误。

      据此question

      您不能在 C 中强制转换赋值运算符的左操作数。

      这个question (Casting a pointer does not produce an lvalue. Why?) 更详细。

      根本原因是所有这些事情,包括你的演员, 创造新价值。将值转换为它已经是的类型, 同样创建一个新值,不管指针是否指向不同 类型是否具有相同的表示。在某些情况下,新 值恰好等于旧值,但原则上它是 新值,不打算用作旧值的参考 对象,这就是为什么它是一个右值。

      为了使它们成为左值,标准必须添加一些特殊的 某些操作在左值上使用时会导致 引用旧对象,而不是新值。 AFAIK 没有 对那些特殊情况的需求很大。

      【讨论】:

      • 如果我没记错的话,这种操作在 Turbo-C 中是允许的。
      • @alk:也适用于旧 GCC 版本。
      猜你喜欢
      • 2011-09-03
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多