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

为何统计N中整除数字的代码出现浮点异常(SIGFPE)?

问题:统计整数N中能整除N的数字个数时触发浮点异常(SIGFPE)的原因

int evenlyDivides(int N){
    int temp = N;
    int residue;
    int count = 0;
    
    while(temp) {
        if(residue = temp % 10 && !(N % residue)) {
            count++;
        }
        temp /= 10;
    }
    
    cout << count;
}

当输入N=20这类包含0的数字时,预期中residue=0时if的第一个条件不成立,会短路跳过N%residue的计算,但实际触发了浮点异常(SIGFPE),这是为什么?


核心问题是运算符优先级:赋值运算符=的优先级远低于逻辑与&&,导致你的if条件表达式执行顺序和预期完全不同。

你原本想表达的逻辑是:

  1. 先把temp%10赋值给residue
  2. 判断residue是否非零,同时判断N能被residue整除

但实际编译器会把表达式解析为:

residue = (temp % 10 && !(N % residue))

也就是先计算temp%10 && !(N%residue)的逻辑结果,再把结果赋值给residue。

以N=20为例:

  1. 第一次循环:temp=20,temp%10=0,逻辑与&&左边为0,直接返回0,residue被赋值为0,跳过右边的!(N%residue)计算
  2. 第二次循环:temp=2,temp%10=2,此时需要计算右边的!(20%residue),但residue当前是0,触发除零操作,导致SIGFPE异常

另外,初始时residue未初始化,如果第一次循环temp%10非零,计算N%residue时会用到垃圾值,属于未定义行为。

修复方法很简单,给赋值表达式加上括号,明确执行顺序:

if( (residue = temp % 10) && !(N % residue) )

这样会先完成residue的赋值,再判断residue是否非零,当residue=0时,逻辑与左边为0,直接短路跳过右边的除零计算,避免异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:55:07