【问题标题】:Can int return-type function return true?int返回类型函数可以返回true吗?
【发布时间】:2012-05-07 11:37:59
【问题描述】:

这是我要编译的程序

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

【问题讨论】:

  • truefalse 是 C++。 C 没有它们。
  • ……除非你#include &lt;stdbool.h&gt;
  • 请注意,您在rec 末尾缺少一个返回语句
  • @BinyaminSharet 当我将 true 更改为 1 时,它可以正常工作
  • 仍然是声明为返回 int 的函数应该在任何执行路径中返回一个 int(main 除外)

标签: c


【解决方案1】:

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

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

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

或者您可以直接使用10 - 上面的方法适用于那些不想记住哪些整数值适用于哪些真值的人(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 值将通过第一次测试但第二次失败。这通常不是问题,因为它几乎总是a bad idea to compare boolean variables with boolean constants anyway

【讨论】:

  • 你建议直接使用10,还是建议使用stdbool.h
  • @Pacerier,我已经开始使用stdbool,因为我喜欢更明确的true/falsebool,而不是可怕的_Bool——我认为它使代码更具可读性和在我看来,这总是一件好事。
【解决方案2】:

如果你想使用true/false,你可以将你的编译器置于C99模式(std=c99用于GCC)(或C11),并包含&lt;stdbool.h&gt;

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

【讨论】:

    【解决方案3】:

    你可以在里面放一个简单的'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);
        }
    

    【讨论】:

      【解决方案4】:

      c 没有适当的布尔值。不过你可以定义它

      #define true 1
      #define false 0
      

      【讨论】:

      • C 有一个适当的布尔类型 _Bool,只是没有为它定义适当的常量,只有你提到的宏。
      • 对,新奇的 C99。 :) 我忘记了,因为当我学习时,我们必须将所有内容编译为 ANSI C。
      • @Justin:ANSI C 现在是 C11。
      【解决方案5】:

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

      short isOdd(long);
      

      我会使用 1 和 0 分别代表 truefalse。这没关系,因为如果您尝试使用 i=1(或任何非零整数)执行以下 sn-p,它会打印 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
      }
      

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 2011-04-04
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多