欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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 }

 

文章转载自: