int int-return函数可以返回true吗?

时间:2012-05-06 06:22:17

标签: c

这是我正在尝试编译的程序

#include<stdio.h>   
int main()
    {
        int i = 0;
        rec(i);
    }
int rec(int i)
    {
        i = i + 1;
        if (i == 10){return true;}
        rec(i);
        printf("i: %d\n", i);
    }

我收到了这个输出

$ gcc -o one one.c
one.c: In function ‘rec’:
one.c:10:24: error: ‘true’ undeclared (first use in this function)
one.c:10:24: note: each undeclared identifier is reported only once for each function it appears in

到目前为止,我认为是布尔值,在c中评估为1。如果是这样,为什么我会收到错误?

5 个答案:

答案 0 :(得分:8)

C中没有truefalse个关键字。stdbool.h中的这些值有一些定义(我认为从C99开始)但有时大多数C程序员只会使用10

如果您不想使用stdbool.h,或者您正在使用不支持它的编译器,您通常可以自己定义常量,例如:

#define FALSE (1==0)
#define TRUE  (1==1)

或者您可以直接使用10 - 上述方法适用于那些不想记住哪个整数值适用于哪个真值的人(a)< / SUP>

0为false,任何其他值都为true。所以你的代码看起来像(修复返回值问题,虽然我不知道为什么它甚至存在,因为它总是返回true。):

#include <stdio.h>   

int rec (int i) {
    i = i + 1;
    if (i == 10)
        return 1;
    printf ("i: %d\n", i);
    return rec (i);
}

int main (void) {
    int rv, i = 0;
    rv = rec (i);
    printf ("rv: %d\n", rv);
    return 0;
}

给你:

i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
rv: 1

我还应该提一下,递归是在搜索空间快速减少时最好使用的解决方案,例如在二叉树搜索中,搜索空间在每次递归调用时减半。它通常不适合你只是在每次调用时增加一个值,但在这种情况下,它可能没问题,因为你将它限制在大约十个级别。


(a):请记住,尽管给定的TRUE定义大多数为1,但任何非零值都将被处理。这意味着两个陈述:

if (isValid)
if (isValid == TRUE)

意味着同样的事情。有大量可能的isValid值将通过第一次测试但未通过第二次测试。这通常不是问题,因为它几乎总是a bad idea to compare boolean variables with boolean constants anyway

答案 1 :(得分:2)

如果要使用true / false,可以将编译器置于C99模式(GCC为std=c99)(或C11),并包含<stdbool.h>

(或者您需要使用预处理程序指令或全局常量来定义true和false。)

答案 2 :(得分:1)

您可以在其中添加一个简单的“if”语句

#include<stdio.h>   
int main()
    {
        int i = 0;
        rec(i);
    }
int rec(int i)
    {
        i = i + 1;
        if (i == 10){
          return 1;
        }
        j = rec(i)
        if (j == 1){
          printf('true')
        }
        printf("i: %d\n", i);
    }

答案 3 :(得分:0)

c没有适当的布尔值。你可以通过

来定义它
#define true 1
#define false 0

答案 4 :(得分:0)

如果您的C不使用C99标准,则既没有true也没有false。设计返回布尔值的函数时,即

short isOdd(long);

我会使用1和0分别代表truefalse。这没关系,因为如果您尝试使用i = 1(或任何非零整数)的以下代码段,则会打印T;如果i = 0,则打印F。

if (i)
  putch('T');
else
  putch('F');

以下是测试数字是否为奇数的函数示例:

short isOdd(long num)
{
  return num%2; // evals to 1 if num is odd; 0 otherwise
}

希望有所帮助。