代码分析

int& getMax(int& a, int& b) {
    return a > b ? a : b;
}
int main() {
    int x = 3, y = 5;
    getMax(x, y) = 10;
    cout << x << " " << y;
    return 0;
}

来源:https://123.hnai.net/oeycb

核心知识点

  1. 函数返回左值引用 int&,返回的是变量本身,不是拷贝值,所以返回值可以被赋值。
  2. a > b ? a : b:三目运算符,当两个操作数都是引用时,结果也是引用。
  3. getMax(x,y) 得到的是y的引用(因为3>5为假,返回b,b是y的别名)。
  4. getMax(x,y)=10 等价于 y = 10

运行输出

3 10

内存视角

  • x=3y=5
  • 传入:a 是x别名,b是y别名
  • a>b3>5 false → 返回b,也就是y的引用
  • 对这个引用赋值10 → 修改y

坑点拓展(容易出错的版本)

❌ 如果返回局部变量引用,UB未定义行为:

int& fun(){
    int t=10;
    return t; // 局部变量出作用域销毁,返回悬垂引用
}

❌ 如果函数返回值是值类型 int getMax(...)

int getMax(int& a, int& b) {
    return a > b ? a : b;
}
getMax(x,y)=10; // 编译报错!返回临时对象(右值),不能赋值

追问测试题

如果x=10,y=2getMax(x,y)=20;输出是多少?

答案 输出:20 2,此时返回a也就是x的引用,修改x。

CSP‑J常考:返回引用的函数调用可以作为左值赋值