6

这是我要编译的程序

#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。如果是这样,为什么我会收到错误消息?

4

5 回答 5

13

C中没有trueor关键字。这些值在(我认为从 C99 开始)中false有一些stdbool.h定义,但大多数 C 程序员通常只会使用1and 0

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

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

或者您可以直接使用1and 0- 上面的方法适用于那些不想记住哪些整数值适用于哪些真值(a) 的人。

0为假,任何其他值为真。所以你的代码看起来像(修复返回值问题,尽管我不确定为什么它仍然存在,因为它总是返回 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值将通过第一次测试但未通过第二次测试。这通常不是问题,因为无论如何将布尔变量与布尔常量进行比较几乎总是一个坏主意

于 2012-05-06T06:26:39.750 回答
2

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

(或者您需要使用预处理器指令或全局常量来定义真假。)

于 2012-05-06T06:25:47.460 回答
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);
    }
于 2012-05-06T06:32:16.030 回答
0

c 没有适当的布尔值。你可以为它定义一个

#define true 1
#define false 0
于 2012-05-06T06:24:42.887 回答
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
}

希望有帮助。

于 2012-05-06T08:30:56.193 回答