なぜあなたはそれを変えたいのですか?(私はそれが運動だと思います...)
ここに興味深いものがあります:
再帰バージョン(ブラケットが少ないあなたのもの):
$ cat acr.c
int has(int q, int*a, int n, int i) {
if (i >= n)
return 0;
else if (a[i] == q)
return 1;
else
return has(q,a,n,i+1);
}
反復バージョン(私のものですが、他のものと似ています):
$ cat aci.c
int has(int q, int* a, int n, int i) {
for (; i < n; ++i)
if (a[i] == q) return 1;
return 0;
}
両方をアセンブリコードにコンパイルして比較します。
$ diff <(gcc-4.7 -std=c99 -S -o - -O3 acr.c) <(gcc-4.7 -std=c99 -S -o - -O3 aci.c)
1c1
< .file "acr.c"
---
> .file "aci.c"
9,10c9,10
< cmpl %ecx, %edx
< jle .L5
---
> cmpl %edx, %ecx
> jge .L5
n ≤ i
したがって、1つのチェックともう1つのチェックという些細な詳細を1つだけ変更した書き直しですi ≥ n
。(ああ、ソースファイルの名前が違います。)
そして、これがclangを使った同じテストです:
$ diff <(clang -std=c99 -S -o - -O3 acr.c) <(clang -std=c99 -S -o - -O3 aci.c)
1c1
< .file "acr.c"
---
> .file "aci.c"
12c12
< .LBB0_1: # %tailrecurse
---
> .LBB0_1: # %for.cond
17c17
< # BB#2: # %if.else
---
> # BB#2: # %for.body
Clangは、アセンブラーコードにさまざまなコメントを付けます。ああ、ファイル名はまだ違います。