You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:45:30