我写了一个简单的二进制搜索程序并遇到问题,请看下面我的三个混淆:
如果我选择icc -g main.c或icc -O0 main.c代码返回错误答案,但如果我使用icc -O2 main.c我可以得到正确的答案.
当代码在答案正确mid = (beg + end) / 2;之前定义时,if(beg <= end) {无论我用什么标志来编译它.
我认为问题是mid递归期间堆栈中的局部变量.
帮帮我,谢谢!
#include <stdio.h>
#define MAX 6
int a[MAX] = {1,2,3,4,5,6};
int improved_binary_search(int key, int beg, int end) {
int mid, temp;
//mid = (beg + end) / 2;
if(beg <= end) {
mid = (beg + end ) /2;
if(a[mid] == key)
return mid;
if(a[mid] < key)
return improved_binary_search(key, mid + 1, end);
if(a[mid] > key)
return improved_binary_search(key, beg, mid - 1);
//printf("test is %d\n", mid);
}
if(mid == 0)
return 0;
if(mid == MAX - 1)
return MAX - 1;
if(a[mid] < key)
return a[mid+1] - key < key - a[mid] ? mid+1 : mid;
if(a[mid] > key)
return a[mid] - key < key - a[mid-1] ? mid : mid-1;
return -1;
}
int main(void)
{
printf("%d\n", improved_binary_search(100, 0, MAX - 1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你刚才宣布mid,但没有初始化它,它可能发生,如果第一,如果条件(if(beg <= end))不然后打的价值mid是不确定的.
这将导致未定义的行为.您看到的行为是因为这个UB而不是因为编译器配置.
您应始终将变量初始化为有意义的值.
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |