我试图解决一个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
为什么std::binary_search()函数为60在数组返回false上cmd?尽管它存储在索引3处。为什么它可以在linux终端上工作?
使用的编译器和c++
<g++> | ||
---|---|---|
cmd (Windows) | g++ (MinGW.org GCC-8.2.0-5) 8.2.0 |
您没有初始化所有数组,这意味着一些元素将具有不确定的值。以任何方式使用这些不确定的值都将导致未定义行为。
如果不使用某些元素,则需要将它们初始化为满足二进制搜索要求的值(对数组进行排序),例如0:
int arr[5] = { 0 }; // Initialize all elements to zero
另一个选择是在搜索时只使用数组的初始化部分:
binary_search(arr + 3, arr + 5, 60)
您得到不同答案的事实是由于未初始化数组块所产生的未定义行为。
但是如果你真的想理解为什么第一个编译器给出的答案和第二个不同,有必要看看每个编译器生成的机器码。
这里和这里是gcc 8.2和gcc 9.3在x86-64架构下生成的机器码。这种行为似乎只是架构依赖(不依赖于操作系统),因为我得到了相同的结果,因为每个编译器。