【问题标题】:Can a function ever be on the left side of an assignment operator?函数可以位于赋值运算符的左侧吗?
【发布时间】:2018-12-06 12:58:31
【问题描述】:

我不知道它可能是什么用例。我只是想知道一个函数是否会出现在 C/C++ 中赋值的左侧。举个例子当然是错的,swap(x,y) = 100;

【问题讨论】:

  • 你应该分别询问 C 和 C++。
  • 它可能看起来像一个函数,但它实际上是 C++ 中的一个引用:a[x] = 1;,即operator[](int); 函数
  • 是的,如果函数返回可修改的左值引用,它可以在 C++ 中

标签: c++ c function syntax


【解决方案1】:

您似乎可以使用引用来做到这一点。在 C++ 中,也就是在 C 中没有引用。

#include <iostream>

int a = 0;

int& swap(int x, int y) {
    return a;
}

int main()
{
    int x = 0, y = 0;
    swap(x, y) = 100;
    std::cout << "a is " << a << std::endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    C 2018 6.5.16 2 说:

    赋值运算符应该有一个可修改的左值作为它的左操作数。

    左值是可以指定对象的表达式(例如对象的名称或*p 表达式,其中* 应用于指向对象的指针`)。在 C 中,函数调用表达式不是左值。

    【讨论】:

    • 最接近的是返回指针的函数,然后取消引用指针:*getAddr(x,y) = 100;
    • @abelenky:你的收盘指标是什么?我认为宏会更接近。
    【解决方案3】:

    正如其他人所提到的,如果函数返回引用,您可以在 C++ 中执行此操作,因为引用是左值。

    您不能将 直接 分配给 C 中函数的返回值,因为它不是左值。但是,如果函数返回一个指针,您可以取消引用它。这会给你一个左值,然后你可以分配给它。

    int x;
    
    int *getx()
    {
        return &x;
    }
    
    int main()
    {
        printf("x=%d\n", x);    // prints 0
        *getx() = 4;
        printf("x=%d\n", x);    // prints 4
    }
    

    【讨论】:

      【解决方案4】:

      在 C 语言赋值表达式中,左操作数必须设计一个对象,其中将存储右操作数。这意味着解析为可分配对象的任何条件表达式都可以。

      但是因为在C中不存在引用对象的概念,你不能直接使用赋值左侧的函数。相反,它可能存在于 C++ 中。 IE。在 C++ 中,您可以:

      int &obj(int pos);
      ...
      obj(0) = 3;
      

      在 C 语言中,你可以用一个小技巧来模拟之前的行为:让你的函数返回一个指向对象的指针,然后在分配它之前取消对返回值的引用。考虑以下片段:

      int *GetPtr(int pos);
      ...
      *GetPtr(0) = 3;
      

      这里的函数GetPtr()返回一个对我们取消引用和分配的对象的引用。

      【讨论】:

      • 在 C 中,带有参数的宏可以位于赋值的左侧。虽然从技术上讲不是函数调用,但它在视觉上看起来就像人类一样。
      • @Peter 你是对的。这只是外观,经过预处理编译器会翻译一些不同的东西。
      猜你喜欢
      • 2015-06-12
      • 2015-01-20
      • 2017-07-16
      • 2019-04-30
      • 2016-06-08
      • 2021-12-17
      • 2016-08-20
      • 2018-06-04
      相关资源
      最近更新 更多