Javascript与C++,相同的代码,不同的结果,这是为什么

Javascript vs C++, same code, different result, why is that?

本文关键字:结果 为什么 代码 Javascript C++      更新时间:2023-09-26

我正在做一个代码挑战,我发现我的代码有一些奇怪的东西,所以我用C++运行它

function sumPrimes (num)
{
    var sum=0;
    for(var i=2; i<num; i++)
    {
        if(primeNumber(i)===true)
            sum+=i;
    }
    return sum;
}

function primeNumber (i)
{
    if(i==2 || i==3 || i==5 || i==7)
        return true;
    if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0)
        return true;
}
sumPrimes(977);

这给了我107812的结果,但是当我对C++做同样的事情时

#include <iostream>
using namespace std;
bool primeNumber(int);
int sumPrimes(int);
int main()
{
    int n;
    cout << "n: ";
    cin >> n;
    cout << "Sum : " << sumPrimes(n) << endl;
    system("PAUSE>=0");
}
int sumPrimes(int n)
{
    int sum = 0;
    for (int i = 2; i < n; i++)
    {
        if (primeNumber(i) == true)
            sum += i;
    }
    return sum;
}
bool primeNumber(int i)
{
    if (i == 2 || i == 3 || i == 5 || i == 7)
        return true;
    if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0)
        return true;
}

结果是108583。

谁能解释一下发生了什么?

这两个程序都存在两个主要问题。

  • 如果不满足条件,则永远不会显式返回false

这些编程语言无法读懂你的心思,所以他们不明白,如果你不返回true如果满足条件,你也想返回false条件满足。

如果执行函数时未返回某些内容,则 JS 代码将返回undefined

您的C++代码实际上调用了未定义的行为 (UB),因为执行到达了没有返回值的非 void 函数的末尾。

不幸的是,这些都不能保证false。一个简单的(也许是天真的?)解决方案是在卷曲结束之前扑通一声return false;

  • 你的算法不正确!

既然你正在努力提高你的技能,我将把这个作为一个练习,但我建议多考虑一下素数的定义。 :)