目前正在研究 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);。关于它的一些东西似乎弄乱了代码,但我不知道是什么。
max % ii根据 C++ 标准,何时为 0 是未定义行为 (UB)。在我的例子中,在运行时有一个 FPU 异常,但是当遇到这种情况时,程序可以做任何事情。
事实上,编译器可以假设这永远不会发生,如果它注意到这种情况发生,它可能会得出各种有趣的结论,直到并包括假设main()不可能被调用。(证明:main()无条件取 13195 mod 0,这不可能发生,因为它是 UB,因此main()不能被调用。)
最可能的解决方法是将循环计数器从 1 或其他一些正数开始。
二元
/运算符产生商,二元%运算符产生第一个表达式除以第二个表达式的余数。如果/or的第二个操作数%为零,则行为未定义。
-- N4713 [expr.mul]/4(强调我的)