代码之家  ›  专栏  ›  技术社区  ›  Prasoon Saurav

过早优化还是我疯了?

  •  7
  • Prasoon Saurav  · 技术社区  · 15 年前

    我最近在comp.lang.c++中看到一段代码,它从一个函数返回一个静态整数的引用。代码是这样的

    int& f()
    {
       static int x;
       x++;
       return x;
    }
    
    int main()
    {
      f()+=1; //A
      f()=f()+1; //B
      std::cout<<f();
    
    }
    

    i+=1 等于 i=i+1 f()+=1 等于 f()=f()+1 我会接到两个电话 f()

    5 回复  |  直到 15 年前
        1
  •  27
  •   Nordic Mainframe    15 年前

    这就是标准所说的 +=

    5.17-7:形式E1 op=E2的表达式的行为等同于 E1=E1 op E2,但E1是

    所以编译器是对的。

        2
  •  10
  •   James Curran    15 年前

    i+=1 功能上 一样 i=i+1

    但从本质上讲,左侧只评估一次。它会产生一个非常量的l值,这就是它所需要的读取值、添加值和写回值。

    operator+= this 实例。 operator+ 返回一个新实例。通常建议(在C++中)先写OOP+=,然后用OP+写OP+。

    (注意这仅适用于C++;在C#, op+= 和你想象的完全一样:只是 op+ ,并且不能创建自己的op+=。它是从Op+中自动为您创建的)

        3
  •  9
  •   Loki Astari    15 年前

    你的想法合乎逻辑但不正确。

    i += 1;
    // This is logically equivalent to:
    i = i + 1;
    


    代码应如下所示:

    int& x = f();
    x += x;
    // Now you can use logical equivalence.
    int& x= f();
    x = x + 1;
    

        4
  •  3
  •   Georg Fritzsche    15 年前

    f() 返回对静态整数的引用。那么 += 1

        5
  •  0
  •   supercat    15 年前

    在我所见过的每种支持+=运算符的语言中,编译器都会对左侧的操作数求值一次,以生成某种类型的地址,然后用它来读取旧值和写入新值。+=运算符不仅仅是语法糖;正如您所注意到的,它可以实现表达式语义,而通过其他方法实现这些语义是很困难的。

    ' Assime Foo is an array of some type of structure, Bar is a function, and Boz is a variable.
      With Foo(Bar(Boz))
        .Fnord = 9
        .Quack = 10
      End With
    
    将计算Foo(Bar(Boz))的地址,然后将该结构的两个字段设置为值9和10。它在C中相当于
      {
        FOOTYPE *tmp = Foo(Bar(Boz));
        tmp->Fnord = 9;
        tmp->Quack = 10;
      }