0

我试图解决一个codeforces 问题,这需要我使用以下公式找到多边形的内角:

((n-2)*180)/n

; 其中'n'是多边形边数。我取了一个大小为 5 的数组来存储三角形(n=3)和正方形(n=4)的角度。编写以下代码以在数组上搜索角度(60 度):

#include<iostream>
#include<algorithm>

using namespace std;

int main(){
    int arr [5];
    
    for(int n=3; n<5; n++){
            arr[n] = ((n-2)*180)/n;
            cout << "arr["<<n<<"] = "<< arr[n];
            cout<<endl;
    }

    if(binary_search(arr, arr+5,60)){
               cout << "YES"<<"\n";
    }
    else{
               cout<< "NO"<<"\n";
    }   
    return 0;
}

在命令提示符(cmd)上编译并运行它后,我得到了以下意外结果:

arr[3] = 60 
arr[4] = 90
NO

后来我在适用于 Linux 的 Windows 子系统上尝试了相同的代码,得到了以下正确的输出:

arr[3] = 60 
arr[4] = 90
YES

为什么数组中 60 的 std::binary_search() 函数在 cmd 上返回 false?即使它存储在索引 3。为什么它在 linux 终端上工作?

使用的编译器和 C++

系统 g++ --版本 C++ 标准
cmd (Windows) g++ (MinGW.org GCC-8.2.0-5) 8.2.0 C++14
linux终端(wsl) g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 C++14
4

2 回答 2

5

您不会初始化所有数组,这意味着某些元素将具有不确定的值。以任何方式使用这种不确定的值都会导致未定义的行为

如果不应该使用某些元素,则需要将它们初始化为满足二分搜索要求(排序的数组)的某个值,例如零:

int arr[5] = { 0 };  // Initialize all elements to zero

另一种选择是在进行搜索时仅使用数组的初始化部分:

binary_search(arr + 3, arr + 5, 60)
于 2021-08-14T08:31:18.513 回答
2

您得到不同答案的事实是由于数组的一部分未初始化而产生的未定义行为。

但是如果你真的想了解为什么第一个编译器给出的答案与第二个不同,那么有必要查看每个编译器生成的机器码。

这里这里是 gcc 8.2 和 gcc 9.3 在 x86-64 架构中生成的机器代码。这种行为似乎只是依赖于架构(不依赖于操作系统),因为对于每个编译器,我得到的结果与你相同。

于 2021-08-14T09:05:53.777 回答