summaryrefslogtreecommitdiff
path: root/3/6_control/27_while_for.c
blob: f7f73f738d5dbb7e966d540146a4df0c34c6de2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>

long fact_for(long n) {
    long i;
    long result = 1;
    for (i = 2; i <= n; i++) {
        result *= i;
    }
    return result;
}

// guarded do
//
// init-s
// t = test-e;
// if (!t) goto done;
//
// loop:
//   body-s
//   update-e;
//   t = test-e;
//   if (t) goto loop;
//
// done:

long fact_for_gd_goto(long n) {
    long i = 2;
    long result = 1;

    int t = i<=n;
    if (!t) {
        goto done;
    }
loop:
    result *= i;
    i++;
    t = i<=n;
    if (t) goto loop;
done:
    return result;
}

int main() {
    printf("for: %ld, goto: %ld\n", fact_for(5), fact_for_gd_goto(5));
    return 0;
}