当计数器在循环中使用时,c++程序会崩溃

C++ program crashes when counter is used inside loop

本文关键字:c++ 程序 崩溃 计数器 循环      更新时间:2023-10-16

我正在编写一个非常小的程序,用于在c++中查找整数的除数。我的main方法基本上是将一个int变量转换为一个var变量,然后调用以int作为参数的factor方法。下面是代码:

void factor(int num)
{
    for(int x = 0; x < ((num + 2) / 2); x++)
    {
        if((num % x) == 0)
        {
            cout << x << " ";
        }
    }
}

程序总是在factor()内崩溃。如果我使用这段代码,它运行得很好:

void factor(int num)
{
    for(int x = 0; x < ((num + 2) / 2); x++)
    {
        {
            cout << x << " ";
        }
    }
}

所以问题在if((num % x) == 0)的某个地方。当我将该行更改为if((num % 2) == 0)if((num % 5) == 0)时,它会产生正确的结果(我使用32作为测试输入)。

几年前我学过c++,后来大部分都忘记了,在遇到这个问题之后,我逐字逐句地复制了我之前解决这个问题的代码(这是有效的)。但是每当我尝试访问循环计数器时,程序仍然崩溃。

我在Arch Linux 64位上使用Code::Blocks 13.12 with GCC "4.9.0 20140604 (pre - release)"

问题是在第一个代码片段中有一个除零,根据标准(n3337) 未定义行为:

5.6p4 乘法运算符 [expr.mul]

二进制/运算符得到商,二进制%运算符得到第一个表达式除以第二个表达式的余数。如果/%的第二个操作数为零,则行为未定义。


由于程序不能计算这样的表达式的值,它将崩溃。

if((num % x) == 0)  // num % 0 on first iteration, application will crash, or order pizza
{
  cout << x << " ";
}

当x为0时,您如何做num%x ?由于在x为0时使用它,程序崩溃。

这将导致运行时错误,我认为是SIGFPE

在for的第一个循环中,x的值为0。Num % x需要除以0,这在数学上是没有意义的,这就是崩溃的原因。

您希望看到该数字的所有除数(它们除该数字,剩下0进行结余)。你应该在2点开始for循环。(1已经是给定的——你可以直接把它打印出来,但你只会打印一半的数字,所以我怀疑你对1和数字本身不感兴趣)

尝试从x = 1开始循环。

如果你想计算一个数字的因数,从0开始没有任何意义。%运算符计算除数num/x的余数。除0没有任何意义,因此该操作的行为是未定义的。这意味着它可以在一个编译器/机器上崩溃,而可以在另一个编译器/机器上产生某种结果。