「C言語/中級者向けの話題」の版間の差分
削除された内容 追加された内容
{{Nav}} タグ: 2017年版ソースエディター |
→再帰を使って2進数表示: 再帰可能性(Recursivity)と再入可能性(Reentrancy)を混同している記述が見られるので修正が必要。 タグ: 2017年版ソースエディター |
||
373 行
#include <stdio.h>
int factorial(int n)
if (n == 0)▼
return 1;▼
return factorial(n - 1) * n;▼
}▼
int main(void) {
380 ⟶ 384行目:
scanf("%d", &i);
printf("%dの階乗は%dです。", i, factorial(i));
▲}
▲ if (n == 0)
▲ return 1;
▲ return factorial(n - 1) * n;
}
</syntaxhighlight>
401 ⟶ 399行目:
factorial(3)に戻り、1*1*2*3が返される。
</syntaxhighlight>
===== 再帰を使って2進数表示 =====
;再帰を使って2進数表示:<syntaxhighlight lang="C" highlight="6,11"line>
#include <stdio.h>
void print_binary(int n) {
if (n < 0) {
puts("-");
print_binary(-n);
return;
}
int x = n / 2;
if (x)
print_binary(x);
putchar("01"[x % 2]);
}
int main(void) {
print_binary(0xbadbeef);
}
</syntaxhighlight>
;::<syntaxhighlight lang="text">
0101110101101101111101110111
</syntaxhighlight>
6行目と11行目で print_binary 自身を呼び出し再帰呼び出しとなっています。
print_binary は、リエントラントでない関数 puts と putchar を呼び出しているのでリエントラントでは有りませんが、問題なく再帰呼び出しが行なえます。
このように、再帰可能性(Recursivity)と再入可能性(Reentrancy)は別個の概念で、再入可能性(Reentrancy)はマルチスレッドやシグナルハンドラーで問題になります。
<!-- この記事にも、再帰可能性(Recursivity)と再入可能性(Reentrancy)を混同している記述が見られるので修正が必要 -->
== 構造体のビットフィールド ==
|