代码分析
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;
}
核心知识点
- 函数返回左值引用
int&,返回的是变量本身,不是拷贝值,所以返回值可以被赋值。 a > b ? a : b:三目运算符,当两个操作数都是引用时,结果也是引用。getMax(x,y)得到的是y的引用(因为3>5为假,返回b,b是y的别名)。getMax(x,y)=10等价于y = 10。
运行输出
3 10
内存视角
x=3,y=5- 传入:
a是x别名,b是y别名 a>b→3>5false → 返回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=2,getMax(x,y)=20;输出是多少?
答案 输出:20 2,此时返回a也就是x的引用,修改x。
CSP‑J常考:返回引用的函数调用可以作为左值赋值。



