"并非所有控制路径都返回一个值“在此程序中是什么意思?

时间:2017-01-08 21:45:02

标签: c function if-statement binary-search cs50

我写了一个代码,它接受输入,直到输入EOF整数(在本例中为999999)。然后它对数字进行排序并在整数数组中搜索我们的针(整数)(称为haystack)。现在我在搜索算法中遇到了问题。编译时会向我显示警告:

  

'搜索':并非所有控制路径都返回值

我认为这意味着在某些情况下该功能可能不会返回任何内容,但问题是我无法想到任何此类情况。我甚至用很多值检查了我的程序,它总是给我正确的输出。任何人都可以帮我找出问题所在。我为此使用了一些 windows native tools compiler

此外,如果有人看到与此相关的 CS50 pset3发现问题,我也使用相同的搜索功能,但在 CS50 IDE 中编译代码时程序从未显示它是否在大海捞针中找到针头。它只是按顺序排列它们然后在那之后停止。

#include <stdio.h>
#include "cs50.h"
#include <stdlib.h>


bool search(int value, int values[], int n);
void sort(int values[], int n);

// maximum amount of hay
#define MAX 65536

int main(int argc, string argv[])
{
    // ensure proper usage
    if (argc != 2)
    {
        printf("Usage: ./find needle\n");
        return -1;
    }

    // remember needle
    int needle = atoi(argv[1]);

    // fill haystack
    int size;
    int haystack[MAX];
    for (size = 0; size < MAX; size++)
    {
        // wait for hay until EOF
        printf("\nhaystack[%i] = ", size);
        int straw = GetInt();
        if (straw == 999999)
        {
            break;
        }

        // add hay to stack
        haystack[size] = straw;
    }
    printf("\n");

    // sort the haystack
    sort(haystack, size);

    // try to find needle in haystack
    if (search(needle, haystack, size))
    {
        printf("\nFound needle in haystack!\n\n");
        return 0;
    }
    else
    {
        printf("\nDidn't find needle in haystack.\n\n");
        return 1;
    }
}

/**
 * Returns true if value is in array of n values, else false.
 */
bool search(int value, int values[], int n)
{
    /* TODO: implement a searching algorithm */
    int first = 0;
    int last = n;
    int middle = (first + last) / 2;

    while (first + 1 < last)
    {
        if (value == values[middle])
        {
            return true;
            break;
        }
        if (value == values[first])
        {
            return true;
            break;
        }
        if (value == values[last])
        {
            return true;
            break;
        }        
        if (value < values[middle])
        {
            last = middle;
            middle = (first + last) / 2;
        }
        if (value > values[middle])
        {
            first = middle;
            middle = (first + last) / 2;
        }
    }
    if (first + 1 >= last)
    {
        return false;
    }
}

/**
 * Sorts array of n values.
 */
void sort(int values[], int n)
{
    // TODO: implement an O(n^2) sorting algorithm
    for (int j = 1; j < n; j++)
    {
        for (int i = 0; i < (n - 1); i++)
        {
            if( values[i + 1] < values[i])
            {
                int b = values[i + 1];
                values[i + 1] = values[i];
                values[i] = b;
            }
        }
    }
    for (int k = 0; k < n; k++)
    {
        printf("haystack[%d] = %d ", k, values[k]);
    }
}

1 个答案:

答案 0 :(得分:1)

编译器不执行您的代码。它不进行价值追踪。虽然可以推断出变量和表达式的值,但这通常是编译器的无法解决的问题。

您的编译器告诉您,当控件到达函数的结束search时,它不知道从}返回什么。

顺便说一下,编写一个名为sort的函数是个坏主意,因为C标准库包含一个具有相同名称的函数。