backup de julho
[h2N7SspZmY.git] / data / pages / c.txt
blob4a0df63c9924ae845d657528e26ad9a1bd3a6fe7
1 ====== C ======
3 [[wp>C_(programming_language)|C]]
5 ===== How to print the current time =====
7 Using [[http://www.cplusplus.com/reference/clibrary/ctime/strftime/|strftime]].
9 <file c show_time.c>
10 #include <stdio.h>
11 #include <time.h>
13 int main()
15         time_t  currtime;
16         char charTime[100] = {0};
17         time(&currtime);
18         strftime(charTime,sizeof(charTime)-1,"%c",localtime(&currtime));
19         printf("time: %s\n", charTime);
20         /* "time: Sat Apr 17 11:43:47 2010" */
22 </file>
24 ===== How to install colorgcc =====
26 <code bash>
27 $ sudo apt-get install colorgcc
28 $ cd /usr/local/bin
29 $ sudo ln -s /usr/bin/colorgcc gcc
30 $ sudo ln -s /usr/bin/colorgcc g++
31 </code>
33 ===== Tail Recursion Without Return =====
35 In a function with a [[wp>Tail_recursion|Tail Recursion]] ...
37 <file c mdc.c>
38 int mdc(int x, int y)
40         if(!y) return x;
41         return mdc(y, x % y);
43 </file>
45 ... we can delete de [[wp>Tail_recursion]] return(s) ...
47 <file c mdc_changed.c>
48 int mdc(int x, int y)
50         if(!y) return x;
51         mdc(y, x % y);
53 </file>
55 ... This works because the return value goes to eax register and, as the other function calls don't change its value, they return the same as the last call done.
57 Another example:
59 <file c ackermann.c>
60 int ackermann(int m, int n)
62         if(!m) return n + 1;
63         if(!n) return ackermann(m - 1, 1);
64         return ackermann(m - 1, ackermann(m, n - 1));
66 </file>
68 This time we have two tail recursive calls, so we need an else.
70 <file c ackermann_changed.c>
71 int ackermann(int m, int n)
73         if(!m) return n + 1;
74         if(!n) ackermann(m - 1, 1);
75         else ackermann(m - 1, ackermann(m, n - 1));
77 </file>
79 ===== Minimal Factorial Program =====
81 <file c f.c>
82 main(n){return !n?:n*main(n-1);}
83 </file>
85 <code bash>
86 $ gcc -o f f.c
87 $ ./f||echo $?
89 $ ./f .||echo $?
91 $ ./f . .||echo $?
93 $ ./f . . .||echo $?
95 $ ./f . . . .||echo $?
96 120
97 </code>
99 ==== Explanation ====
101   * main return type defaults to int
102   * main first parameter defaults to int and is the number of command line arguments
103   * "!n" is the same as "n == 0"
104   * "x ? : y" is the same as "x ? x : y"
105   * $? is the return value of the program
107 ===== Minimal Fibonacci Program =====
109 Same idea of the factorial.
111 <file c f.c>
112 main(n){return n<2?:main(n-1)+main(n-2);}
113 </file>
115 <code bash>
116 $ gcc -o f f.c
117 $ ./f||echo $?
119 $ ./f .||echo $?
121 $ ./f . .||echo $?
123 $ ./f . . .||echo $?
125 $ ./f . . . .||echo $?
127 $ ./f . . . . .||echo $?
129 </code>