为何统计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条件表达式执行顺序和预期完全不同。
你原本想表达的逻辑是:
- 先把
temp%10赋值给residue - 判断
residue是否非零,同时判断N能被residue整除
但实际编译器会把表达式解析为:
residue = (temp % 10 && !(N % residue))
也就是先计算temp%10 && !(N%residue)的逻辑结果,再把结果赋值给residue。
以N=20为例:
- 第一次循环:
temp=20,temp%10=0,逻辑与&&左边为0,直接返回0,residue被赋值为0,跳过右边的!(N%residue)计算 - 第二次循环:
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
相关产品推荐
相关产品推荐

