【问题标题】:why lvalue required as increment operand error? [duplicate]为什么需要左值作为增量操作数错误? [复制]
【发布时间】:2012-10-01 18:31:48
【问题描述】:

为什么需要左值作为 a=b+(++c++); 中的增量操作数错误?

只想将 'b+(c+1)' 分配给 'a' 并同时将 'C' 增加 2。

我是初学者,只是想了解一下“LVALUE ERROR”究竟是什么?

main()
{

int a=1,b=5,c=3;

a=b+(++c++);  

printf("a=%d   b= %d   c= %d \n",a,b,c);
}

【问题讨论】:

  • Err...你到底想做什么?似乎您想将 c 增加 2,但我认为这行不通。你要么做一个前置增量,要么做一个后置增量。但我从未见过(甚至考虑过使用)两者。我的猜测是,它根本不知道如何处理该代码。
  • 我只想将 'b+(c+1)' 分配给 'a' 并同时将 'C' 增加 2。
  • @leppie - 虽然此类代码的行为是未定义的,但问题本身不是关于未定义的行为,而是关于左值。
  • 初学者不应该考虑编写这样的代码,专家知道一开始就不要编写这样荒谬的代码。即使它可以工作,你认为优势是什么?即使它有效,它也会在"too clever" 下梳理。

标签: c increment lvalue decrement operand


【解决方案1】:

后缀增量比前缀增量绑定得更紧密,所以你想要的是这样的:

a = b + (++c)++;

不过,这不是合法的 C,因为前缀递增的结果(如您示例中的后缀递增的结果)不是 lvalue。这意味着它只是一个值;它不再引用像“c”这样的特定对象,所以试图改变它是没有意义的。它不会有明显的效果,因为不会更新任何对象。

我个人认为在任何情况下用两个语句来做会更清楚。

a = b + c + 1;
c += 2;

【讨论】:

    【解决方案2】:

    LVALUE 表示不存在应该执行操作的变量。

    C 文件基本上只是文本文件,需要特定的格式,因此编译器可以理解。

    编写 ++Variable++ 之类的东西对编译器来说完全是无稽之谈。

    你基本上可以把 ++c 想象成:

    Var += 1;
    return Var;
    

    而 c++ 是:

    int Buf = Var;
    Var += 1;
    return Buf;
    

    要“修复”您的代码:

    void main() {
        int a=1,b=5,c=3;
        a = b + (++c);  //Equals 5 + 4
        printf("a=%d   b= %d   c= %d \n",a,b, ++c);  //a = 9, b = 5, c = 5
    }
    

    这样,你会得到你想要的结果,而编译器不会抱怨。

    请记住,在组合操作中使用 ++c 或 c++ 时,顺序很重要。 使用++c时,使用较大的值进行运算,使用c++时,使用旧值进行运算。

    这意味着:

    int a, c = 5;
    a = 5 + ++c;  //a = 11
    

    同时

    int a, c = 5;
    a = 5 + c++;  //a = 10
    

    因为在后一种情况下,在将 c 添加到 5 并存储在 a 之后,c 只会是 '6'。

    【讨论】:

    • 技术上++Variable++ 不是同时调用两个函数,它根本不是任何函数调用。该表达式有一个已定义的绑定:++(Variable++),由于不同的原因这是非法的,但与同时应用(或调用)的操作(或函数)无关。
    • 是的,如果我们想了解它的技术。我试图让它易于理解,但你当然是对的。让我们坚持:'编译器不会接受它'。
    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 2011-09-07
    • 2020-10-06
    • 2021-05-11
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多