zoukankan      html  css  js  c++  java
  • 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
    %p", &a, &b);
     49     
     50     //    int a[5] = {10, 20 ,30, 40, 50}; //20个字节, 第一个元素的地址最低(从低到高存取原则)
     51     //    //数组名,代码数组的首地址,同时也是数组中第一个元素的地址,数组名是一个常量地址,因此不能赋值,既不能参与运算。
     52     //    printf("%p
    %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
    ", a);
     63     //    //2.按位或 |,
     64     //    int b = 5 | 7;
     65     //    // 5 0101,
     66     //    //|7 0111,  同为 0 则为 0 ,否则为 1
     67     //    //=7 0111
     68     //    printf("b = %d
    ", b);
     69     //
     70     //    //2.按位异或 ^,
     71     //    int c = 5 ^ 7;
     72     //    // 5 0101,
     73     //    //^7 0111,  相同为 0 , 不同为 1
     74     //    //=2 0010
     75     //    printf("c = %d
    ", 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
    ", d);
     85     //
     86     //    //2.左移运算符, 将二进制数左移, 每左移一位相当于 * 2
     87     //    char e = 1 << 1;  //1 0000 0001
     88     //    //  0000 0010
     89     //    printf("e = %d
    ", e);
     90     //
     91     //    //2.右移运算符, 将二进制数右移, 每右移一位相当于 / 2
     92     //    char f = 16 >> 3;  //16 0001 0000
     93     //    //2  0000 0010
     94     //    printf("f = %d
    ", 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
     ", 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
    ", 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
    ", 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
    ", 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("
    ");
    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
    ", 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("春暖花开~~
    ");
    255     //            break;
    256     //        case Summer:
    257     //            printf("太热了~~
    ");
    258     //            break;
    259     //        case Autumn:
    260     //            printf("金黄的果子~~
    ");
    261     //            break;
    262     //        case Winter:
    263     //            printf("鹅毛飞雪~~
    ");
    264     //            break;
    265     //        default:
    266     //            printf("不看题呀你!!!
    ");
    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
    ", 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
    ", max);
    290     //    printf("x = %.2f
    ", x);
    291     //    printf("y = %.2f
    ", 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人吃
    ", 10 - n);  //先吃
    324         eatApple(n);
    325         printf("第%d人吃
    ", 10 - n);    //先留后吃
    326     }
    327 }
  • 相关阅读:
    经典的Android案例项目源码
    技术面试(项目经验)
    从零开始搭建架构实施Android项目
    Android 开源项目第五篇——优秀个人和团体篇
    DOM,SAX,JDOM,DOM4J 四种方式解析xml
    Android小项目:记事本
    图像的读取、缩小、保存
    android中获取图片、获取图片像素、处理像素等基础知识
    图像透明化
    Notification应用的复习
  • 原文地址:https://www.cnblogs.com/zhaoashen/p/4387356.html
Copyright © 2011-2022 走看看