带条件运算的函数出现无限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
相关产品推荐
相关产品推荐

