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

trueCにはまたはキーワードはありません。 (C99以降)にはこれらの値のライブラリ定義falseがいくつかありますが、ほとんどのCプログラマーはとを使用することがよくあります。stdbool.h10

を使用したくない場合stdbool.h、またはそれをサポートしていないコンパイラで作業している場合は、通常、次のように定数を自分で定義できます。

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

1または、直接使用することもできます0-上記の方法は、どの整数値がどの真理値に適用されるかを覚えておく必要がない人向けです(a)

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

また、再帰は、検索スペースが各再帰呼び出しで半分になる二分木検索など、検索スペースが急速に削減される場合に最適なソリューションであることにも言及する必要があります。通常、呼び出しごとに値をインクリメントするだけの場合には適していませんが、この場合は、約10レベルに制限しているので、おそらく問題ありません。


(a):与えられたTRUEの定義はほとんど1になりますが、ゼロ以外の値はそのように扱われることに注意してください。つまり、次の2つのステートメントがあります。

if (isValid)
if (isValid == TRUE)

同じことを意味するものではありません。isValid最初のテストには合格し、2番目のテストには不合格となる可能性のある値は多数あります。とにかくブール変数をブール定数と比較することはほとんどの場合悪い考えなので、これは通常問題ではありません。

于 2012-05-06T06:26:39.750 に答える
2

true/を使用する場合falseは、コンパイラをC99モード(std=c99GCCの場合)(またはC11)にして、を含めることができます<stdbool.h>

(または、プリプロセッサディレクティブまたはグローバル定数を使用してtrueとfalseを定義する必要があります。)

于 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 に答える