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

带条件运算的函数出现无限while循环问题,添加断言能否让代码按预期执行?

问题解答

核心结论

添加断言不能让代码按照预期逻辑执行。断言的作用仅为运行时条件校验,条件不满足时直接终止程序,无法修正代码本身的逻辑错误,也不会干预编译器的代码生成逻辑,你的问题根源是代码逻辑本身存在错误,和编译环节无关。

现有代码的问题列表

  • 逻辑死循环根源:你写的逻辑会在77和38之间无限往复:77第一次整数除法减半得到38(偶数),执行2*38+1得到77,回到循环初始值,永远不会到1
  • 分支判断逻辑错误:k == 1的分支永远无法触发,前面的k%2==0和k%2!=0已经覆盖了所有整数的情况,1是奇数会走第二个分支,不会执行打印"blue sky!"的逻辑
  • 格式符使用错误:printf用%lu(无符号长整形)打印long int(有符号长整形)属于未定义行为,应该用%ld
  • 函数定义不符合声明:hailstone声明返回long int,但实际没有return语句,属于未定义行为

修正后的参考代码

如果你要实现符合你描述的规则,需要调整运算逻辑避免出现循环,以下是参考实现:

#include "stdio.h"
#include "assert.h"

long int hailstone(long int k);

int main(void) {
  long int n = 77;
  hailstone(n);
  return 0;
}

long int hailstone(long int k) {
  // 断言仅用来校验输入合法性,比如要求输入必须是正整数,无法修正逻辑错误
  assert(k > 0);
  while (k != 1) {
    printf("%ld ", k);
    k = k / 2;
    if (k == 1) {
      break;
    }
    if (k % 2 == 0) {
      // 原规则的2k+1会导致循环,这里根据实际需求调整为k+1,你可以自行修改规则
      k += 1;
    } else {
      k = 3 * k + 1;
    }
  }
  printf("\nblue sky!\n");
  return k;
}

内容的提问来源于stack exchange,提问作者JoeP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:57:01