iOS开发之c语言基础 扩展知识点 及 企业面试题
1 //
2 // main.m
3 // LessonScale
4 // 6 // Copyright (c) 2015年 Ashen. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10 //当程序编译时,只会编译.m文件,不会编译.h文件
11 //#import 比 #include ,要略胜一筹,等通过#import多次导入头文件时,只会将内容拷贝一次
12 #import "Header.h" //导入意味着,将文件中得内容全部拷贝
13
14
15 //#define 宏名 要替换的内容
16 //宏的作用,只做替换,所有使用N的地方,都替换成20
17 #define N 20 //无参数宏
18
19 #define MUL(A,B) ((A) * (B)) //带参数的宏
20
21 //#define kMaxValue(A, B) A > B ? A : B//比较两个数的最大值
22 #define kMaxValue1(A, B) ({typeof(A) __a = A; typeof(B) __b = B; __a > __b ? __a : __b;})
23 /*
24 宏的注意事项:
25 1.宏名一般都是大写, 并且参数名大写
26 2.参数要加括号。
27 3.宏替换的内容不能有分号;
28 4.宏名和参数之间不能出现空格。
29 */
30
31 int main(int argc, const char * argv[]) {
32
33
34
35 ///////////////////C语言补充课程 进制,位运算符 上课笔记 ///////
36
37 //一、进制
38 //*************************
39
40
41 // 9 十进制 , 09 八进制, 0x9 十六进制, 0b9 二进制
42 // %d %o %0x 二进制输不出来
43
44 //栈区的内存分配原则:从高到底分配,从低到高存取。
45 //地址:内存单元的编号。
46 // int a = -5; //计算机中存取数据,是去数据的补码;负数的补码:绝对值取反加1
47 // int b = 20;
48 // printf("%p\n%p", &a, &b);
49
50 // int a[5] = {10, 20 ,30, 40, 50}; //20个字节, 第一个元素的地址最低(从低到高存取原则)
51 // //数组名,代码数组的首地址,同时也是数组中第一个元素的地址,数组名是一个常量地址,因此不能赋值,既不能参与运算。
52 // printf("%p\n%p", a, a + 1);
53
54
55 //二、位运算符
56 //*************************
57 // ,将数转变成二进制数之后的每一位进行运算
58 // //1.按位与 & , 作用清 0 操作
59 // int a = 5 & 7; // 5 0101,
60 // //&7 0111, 同为 1 则为 1 ,否则为 0
61 // //=5 0101
62 // printf("a = %d\n", a);
63 // //2.按位或 |,
64 // int b = 5 | 7;
65 // // 5 0101,
66 // //|7 0111, 同为 0 则为 0 ,否则为 1
67 // //=7 0111
68 // printf("b = %d\n", b);
69 //
70 // //2.按位异或 ^,
71 // int c = 5 ^ 7;
72 // // 5 0101,
73 // //^7 0111, 相同为 0 , 不同为 1
74 // //=2 0010
75 // printf("c = %d\n", c);
76 //
77 // //2.按位取反 ~
78 // char d = ~5;
79 // // 5 0000 0101
80 // //~ 1111 1010 负数, 求补码, 取反加1,
81 // // 1000 0101 + 1
82 // // 1000 0110
83 // // -6
84 // printf("d = %d\n", d);
85 //
86 // //2.左移运算符, 将二进制数左移, 每左移一位相当于 * 2
87 // char e = 1 << 1; //1 0000 0001
88 // // 0000 0010
89 // printf("e = %d\n", e);
90 //
91 // //2.右移运算符, 将二进制数右移, 每右移一位相当于 / 2
92 // char f = 16 >> 3; //16 0001 0000
93 // //2 0000 0010
94 // printf("f = %d\n", f);
95 //
96 // //三、无符号和有符号的区别
97 // //有符号的数,将会把最高位拿出来作为符号位,用来计数的位数就少了一位。 0000 0000 最大 127
98 // //无符号的数,则所有的位数,都可以用来计数 0000 0000 最大 255
99 // //unsigned char 无符号, char 有符号; 默认是有符号
100 //
101 // /*不同数据类型取值范围
102 // 有符号:
103 // char: -2^7 ~ 2^7 - 1.
104 // short: -2^15 ~ 2^15 - 1.
105 // int: -2^31 ~ 2^31 - 1.
106 // 无符号:
107 // unsigned char: 0 ~ 2^8 - 1;
108 // unsigned short 0 ~ 2^16 - 1;
109 // unsigned int : 0 ~ 2^32 - 1;
110 // */
111 //
112 // //交换两个变量
113 // int aa = 10, bb = 20;
114 //
115 // //Method one: 利用异或
116 // aa = aa ^ bb;//aa与bb的不同点存到aa中。
117 // bb = aa ^ bb;//aa代入aa,的aa,存入bb中
118 // aa = aa ^ bb;
119 //
120 // // //Method two:
121 // // aa = aa + bb;
122 // // bb = aa - bb;
123 // // aa = aa - bb;
124 //
125 // // //Method Three第三方变量temp略
126 // printf("%d\n ", aa);
127 //
128 //
129 //
130 //三、面试题:
131 //*************************
132 //
133 // //1. 高四位和低四位互换
134 // unsigned char a1 = 0b10010011;
135 // //把低四位移动到左边。左移 4 位
136 // unsigned char left1 = a1 << 4;
137 // unsigned char right1 = a1 >> 4;
138 // a1 = left1 | right1;
139 // printf("%d\n", a1);
140 //
141 //
142 // //2. 奇偶互换
143 // unsigned char a2 = 0b10010011; //10010011 >>> 0110 0011
144 // //奇数位移动到偶数位
145 // unsigned char left2 = a2 << 1;
146 // //保留偶数位, 将奇数位清0 , 保留哪一位,哪一位 & 1;
147 // left2 = left2 & 0b10101010;
148 // //偶数位移动到奇数位
149 // unsigned char right2 = a2 >> 1;
150 // //保留奇数位,将偶数位清0
151 // right2 = right2 & 0b01010101;
152 //
153 // a2 = left2 | right2;
154 // printf("%d\n", a2);
155 //
156
157 // //3. 循环移位。
158 // int num = 0;
159 // printf("请输入左移的位数:");
160 // scanf("%d",&num);
161 // num %= 8;
162 // unsigned char a3 = 0b11111111;
163 // //左移 num 位
164 // unsigned char left3 = a3 << num;
165 // //右移 8 - num 位
166 // unsigned char right3 = a3 >> (8 - num);
167 //
168 // a3 = left3 | right3;
169 // printf("%d\n", a3);
170 //
171 //
172
173
174
175 //四、宏的使用
176 //*************************
177
178 // int a[N] = {0};
179 // for (int i = 0; i < N; i++) {
180 // a[i] = arc4random() % (20 - 10 + 1) + 10;
181 // printf("%d ", a[i]);
182 // }
183 // for (int i = 0 ; i < N - 1; i++) {
184 // for (int j = 0; j < N - 1 - i; j++) {
185 // if (a[j] > a[j + 1]) {
186 // int temp = a[j];
187 // a[j] = a[j + 1];
188 // a[j + 1] = temp;
189 // }
190 // }
191 // }
192 // printf("\n");
193 // for (int i = 0; i < N; i++) {
194 // printf("%d ", a[i]);
195 // }
196 //
197
198 //printf("%d", MUL(10 + 5, 5 + 10));
199
200
201
202
203 //五、条件编译
204 //*************************
205 //根据不同的条件,编译不同的代码
206 //1.编辑(写代码) 2.预编译(替换) 3.编译(生成目标文件) 4.链接 5.运行
207
208 //第一种形式
209 //#define ASHEN
210 //#ifdef ASHEN
211 // int d = 50;
212 //#else
213 // int d = 10;
214 //#endif
215 // printf("%d\n", d);
216
217 //第二种形式
218 //#ifndef ASHEN
219 // int d = 10;
220 //#else
221 // int d = 20;
222 //#endif
223 //
224
225 //第三种形式
226 //#if !1
227 // int b = 10;
228 //#else
229 // int b = 20;
230 //#endif
231
232
233 //六、枚举
234 //*************************
235 //罗列出所有的可能性
236 //枚举中的枚举值都是一个一个的标志符,不是变量,都有对应的整数值
237 // enum season{
238 // Spring, //枚举值:春,夏,秋, 冻
239 // Summer = 100,//此时不是赋值,是对应关系
240 // Autumn = 200,
241 // Winter
242 // };
243 // typedef enum season Sea;
244 // // Sea s = Winter;//定义枚举变量
245 //
246 // // printf("%d",s);
247 //
248 // Sea number = 0;
249 // printf("请输入季节(e.g. 春(0),夏季(100),秋季(200),冬季(201):");
250 // scanf("%d",&number);
251 //
252 // switch (number) {
253 // case Spring:
254 // printf("春暖花开~~\n");
255 // break;
256 // case Summer:
257 // printf("太热了~~\n");
258 // break;
259 // case Autumn:
260 // printf("金黄的果子~~\n");
261 // break;
262 // case Winter:
263 // printf("鹅毛飞雪~~\n");
264 // break;
265 // default:
266 // printf("不看题呀你!!!\n");
267 // break;
268 // }
269
270 //逗号表达式
271 //*************************
272 //c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14,(a=3*5,a*4)的值是60,原因在于赋值运算优先级高于逗号表达式。
273 // int a = 0, x = 0, y = 0;
274 // //a = 2 * (x = y = 20, x * 3); 等价于以下式子
275 // a = 2 * ({
276 // x = y = 20;
277 // x * 3;
278 // });
279 // printf("%d\n", a);
280
281
282 // //#define kMaxValue(A, B) A > B ? A : B
283 // //#define kMaxValue1(A, B) ({int __a = A; int __b = B; __a > __b ? __a : __b;})
284 // // x++ > y++ ? x++ : y++
285 // //({typeof(x++) __a = x++; typeof(y++) __b = y++; __a > __b ? __a : __b;})
286 // //typeof 获取参数的类型
287 // float x = 3, y = 5.6;
288 // float max = kMaxValue1(x++, y++);
289 // printf("max = %.2f\n", max);
290 // printf("x = %.2f\n", x);
291 // printf("y = %.2f\n", y);
292
293
294 //递归函数
295 //*************************
296 //本质:调用和自身功能完全相同的函数
297
298
299 void showNum(int n);
300 showNum(54321);
301 return 0;
302 }
303
304 //求阶乘
305 int factorial(int n){
306 return n > 1 ? n * factorial(n - 1) : 1;
307 }
308
309 //倒叙输出
310 void showNum(int n){
311
312 if (n == 0) {
313 return;
314 }
315 printf("%d ", n % 10);
316 showNum(n / 10);
317 }
318
319 //吃苹果
320 void eatApple(int n){
321 if (n != 0) { //如果n不等于0,继续执行
322 n--;
323 //printf("第%d人吃\n", 10 - n); //先吃
324 eatApple(n);
325 printf("第%d人吃\n", 10 - n); //先留后吃
326 }
327 }