iOS开发之c语言基础 扩展知识点 及 企业面试题
程序员文章站
2022-03-20 16:54:58
文章转载自:http://www.pythonheidong.com/blog/article/2537/ 文章转载自:http://www.pythonheidong.com/blog/article/2537/ ......
文章转载自:
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 }
文章转载自: