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 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。