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 }

 

你可能感兴趣的:(ios开发)