if(x % y == 0) 导致我的程序不输出任何内容?

Hor*_*ice 0 c++

目前正在研究 euler 项目的第三个问题,并偶然发现了一个奇怪的问题,这让我用头撞墙试图弄清楚。我将问题隔离到这一小部分代码。

#include <iostream>


int main()
{
    long max = 13195;
    long largestPrimeNumber = 0;

    for(int i = 0; i < max; i++)
    {
        if(max % i == 0)
        {
            std::cout << "test\n";
        }
        else
        {
            std::cout << "other test\n";
        }
    }
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个小测试程序的最终目标是为每个非素数输出“测试”,为每个小于 13195 的素数输出“另一个测试”,如下所示:

test
test
test
test
another test
test
test
another test
Run Code Online (Sandbox Code Playgroud)

我尝试过将其放入函数并在 for 循环中运行该函数的方法。它工作正常,直到我添加条件(max % i == 0);。关于它的一些东西似乎弄乱了代码,但我不知道是什么。

cdh*_*wie 8

max % ii根据 C++ 标准,何时为 0 是未定义行为 (UB)。在我的例子中,在运行时有一个 FPU 异常,但是当遇到这种情况时,程序可以做任何事情

事实上,编译器可以假设这永远不会发生,如果它注意到这种情况发生,它可能会得出各种有趣的结论,直到并包括假设main()不可能被调用。(证明:main()无条件取 13195 mod 0,这不可能发生,因为它是 UB,因此main()不能被调用。)

最可能的解决方法是将循环计数器从 1 或其他一些正数开始。

二元/运算符产生商,二元%运算符产生第一个表达式除以第二个表达式的余数。如果/or的第二个操作数%为零,则行为未定义。

-- N4713 [expr.mul]/4(强调我的)