函数可以位于赋值运算符的左侧吗?

时间:2018-12-06 12:58:32

标签: c++ c function syntax

我不知道它可能是什么用例。我只是想知道一个函数是否会出现在C / C ++的赋值左侧。举个例子,IDAT: CRC error `' @ error/png.c/MagickPNGErrorHandler/1643

当然是错误的

4 个答案:

答案 0 :(得分:4)

看来您可以使用引用来做到这一点。在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;
}

答案 1 :(得分:2)

C 2018 6.5.16 2说:

  

赋值运算符的左值应为可修改的左值。

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

答案 2 :(得分:1)

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

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

int x;

int *getx()
{
    return &x;
}

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

答案 3 :(得分:1)

在C语言赋值表达式中,左操作数必须设计一个对象,右操作数将存储在该对象中。这意味着解析为可分配对象的 conditional-expression 都将起作用。

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

$scope.link= "https://www.w3schools.com"

在C语言中,您可以使用一个小技巧来模拟以前的行为:使函数返回指向该对象的指针,然后在赋值之前对返回值进行解引用。考虑以下片段:

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

函数int *GetPtr(int pos); ... *GetPtr(0) = 3; 返回对我们取消引用和分配的对象的引用。