「C言語/中級者向けの話題」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
{{Nav}}
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎再帰を使って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));
 
int factorial(int n) {
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)を混同している記述が見られるので修正が必要 -->
 
== 構造体のビットフィールド ==