c++ 为什么我在这里得到浮点异常(SIGFPE)?

pnwntuvh  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(207)

问题是计算N中能整除N的位数。这是我的代码-

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;
}

如果residue变量的值为零(比如N = 20),那么它将无法满足if语句的第一个条件,因此永远不会达到if语句的第二个条件(在这里我找到了N % residue)。

mzaanser

mzaanser1#

你的技巧是可以理解的,但通常这是不好的做法,因为许多可能的陷阱类型。你的代码是一个范例,为什么?
编译器处理:

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

作为

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

根据C++ operator precedence,这是非常合乎逻辑的。
可能的解决方案:

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

s1ag04yj2#

以下是我在构建您的应用程序时得到的结果:

/*
 * BUILD:
 * c:\temp>g++ -g -Wall -pedantic -o x x.cpp
 * x.cpp: In function 'int evenlyDivides(int)':
 * x.cpp:9:20: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
 *     9 |         if(residue = temp % 10 && !(N % residue)) {
 *       |            ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

下面是我运行它时崩溃的地方(N=20):

if(residue = temp % 10 && !(N % residue)) { // SIGFPE here: temp=2, residue=0

建议变更:

if((residue = temp % 10) && !(N % residue)) { ... }

相关问题