C++扩展欧几里得函数中逗号分隔返回值是否必要?
关于扩展欧几里得算法C++实现中return语句逗号表达式的疑问
近日复习扩展欧几里得算法时,我发现一段C++代码库实现:
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; ll euclid(ll a, ll b, ll &x, ll &y) { if (!b) { return x = 1, y = 0, a; } ll d = euclid(b, a % b, y, x); return y -= a / b * x, d; }
该函数返回值类型为long long,据我了解C++中逗号表达式仅保留最右侧值作为返回结果,因此我疑惑:为何作者仍要在return语句的同一行中写入x = 1, y = 0或y -= a / b * x这类赋值操作?
解答
- 逗号表达式的核心特性是按顺序执行所有子表达式,虽然最终return的是最右侧的值(也就是最大公约数
a或d),但前面的赋值操作会先执行。由于x和y是引用参数,这些赋值会直接修改调用者传入的变量——这正是扩展欧几里得算法的核心需求之一。 - 扩展欧几里得算法不仅要计算两个数的最大公约数,还要找到满足
a*x + b*y = gcd(a,b)的整数x和y:- 当
b=0时,属于基础情况:a*1 + 0*0 = a,所以给x赋值1、y赋值0,之后返回a(此时a就是gcd)。 - 递归返回后,通过
y -= a / b * x更新当前层的y值,这是算法递推公式的变形——利用递归得到的下层解,推导当前层的x和y。
- 当
- 这种写法只是把变量赋值和return合并成一行的紧凑写法,和分开写的效果完全一致:
前者只是用逗号表达式简化了代码结构,没有改变逻辑。if (!b) { x = 1; y = 0; return a; } // ... y -= a / b * x; return d;
内容的提问来源于stack exchange,提问作者the_only_sa
相关产品推荐
相关产品推荐

