这是我正在尝试编译的程序
#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。如果是这样,为什么我会收到错误?
答案 0 :(得分:8)
C中没有true
或false
个关键字。stdbool.h
中的这些值有一些库定义(我认为从C99开始)但有时大多数C程序员只会使用1
和0
。
如果您不想使用stdbool.h
,或者您正在使用不支持它的编译器,您通常可以自己定义常量,例如:
#define FALSE (1==0)
#define TRUE (1==1)
或者您可以直接使用1
和0
- 上述方法适用于那些不想记住哪个整数值适用于哪个真值的人(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分别代表true
和false
。这没关系,因为如果您尝试使用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
}
希望有所帮助。