#import <Foundation/Foundation.h>

#define kDeBug

//当一个变量只有固定几个取值的时候,可以定义一个枚举类型
//枚举类型声明了一组常数,将人能看懂的标示符和计算机能看懂的数字建立对应关系
//如果枚举类型不指定常数,默认从0开始, 依次加1
//enum season{
//    spring = 1,
//    summer,
//    autumn = 4,
//    winter
//};

typedef enum Season{
    spring = 1 << 0,//1
    summer = 1 << 1,//2
    autumn = 1 << 2,//3
    winter = 1 << 3 //4

}SEASON;


//typedef enum season SEASON;




int main(int argc, const char * argv[]) {
    //按位 与 & ,有0为0,全1为1
    //作用:把某些二进制位清0,需要清0的跟0与,需要保留的位跟1与
//    int a = 0b11111111;
//    int c = a & 0b00001111;
//    printf("%d",c);
    
    //按位 或 | ,有1为1,全0为0
    //作用:把某些二进制位置1,
//    int b = 0b0110100;
//    int a = b | 0b00001111;
//    printf("%d",a);
    
    //按位 反 ~ ,有1为0,有0为1
//    int a = 0b00000011;
//    int b = ~a;
//    printf("%d", b);
    
    //按位 异或 ^ 相异为1,相同为0
    //用来记录二进制之间的差异
    //功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。
    
//    int a = 8,b = 7;
//    printf("a = %d b = %d", a ^ (a ^ b), b ^ (a ^ b));
//    int a = 8,b = 7;
//    a = a ^ b;//a,b的差值
//    b = a ^ b;//b = b 和 a,b的差值得到a的值
//    a = a ^ b;//a = b(现在等于a的值)和a,b的差值得到b的值
//    printf("a = %d b = %d", a, b);
    
    //<<, >>左移,右移运算符
    //<<,左移一位相当于乘2;
    //>>,右移一位相当于除2;
//    unsigned char a = 0b11000001;
//    a = a << 1;
//    unsigned char b = 0b11000001;
//    b = b >> 1;
//    printf("%d",b);
    
    //预编译指令
    //条件编译  作用:按不同条件,编译不同指令
    //1.[#ifdef]2.[ifndef]3.[if]
    
//    int a = 10;
//#ifdef kDeBug
//    printf("%d", a);
//#else
//    printf("%d", a + 5);
//#endif
   
//#ifndef kDeBug
//    printf("hello");
//#else
//    printf("world");
//#endif

//#if 2
//    printf("a");
//#elif 1 + 2
//    printf("b");
//#elif 0
//    printf("c");
//#else
//    printf("d");
//#endif
    
    //枚举
//    SEASON a = autumn | winter;
printf("a = %d", a);
//    
//    switch ((int)a) {
//            
//        
//        case spring | summer:
//            printf("春天或者夏天");
//            break;
//        case spring | winter:
//            printf("春天或者冬天");
//            break;
//        case spring | autumn:
//            printf("春天或者秋天");
//            break;
//        case summer | autumn:
//            printf("夏天或者秋天");
//            break;
//        case autumn | winter:
//            printf("秋天或者冬天");
//            break;
//            
//        case spring:
//            printf("spring");
//            break;
//        case summer:
//            printf("summer");
//            break;
//        case autumn:
//            printf("autume");
//            break;
//        case winter:
//            printf("winter");
//            break;
//
//        default:
//            printf("sorry");
//            break;
//    }
//    
    
    //const 用于修饰一个变量不能被修改
//    const int a = 5;
    //const 修饰数组,数组里面的每个元素都不能修改
//    const int a[3] = {1,2,5};
    
//int * const p  指针不可以重指向,但是通过指针可以修改指针指向的内容
//    int a = 5, b = 9;
//    int * const p = &a;
//    *p = 8;
    *p = &b;
//    printf("%d",*p);
    
// int const * p 指针可以做重指向,但是通过指针不可以修改指向的内容
//    int a = 5, b = 8;
//    int const * p = &a;
//    //*p = 5;//error
//    p = &b;
//    printf("%d",*p);

//const int * p 指针可以做重指向,但是通过指针不可以修改指向的内容
//    int a = 5, b = 5;
//    const int * p = &a;
    *p = 8;
//    p = &b;
    
//const int * const p 指针不可以做重指向,通过指针也不可以修改指向的内容
//    int a = 5, b = 4;
//    const int * const p = &a;
    
//int const * const p 指针不可以做重指向,通过指针也不可以修改指向的内容
//    int a = 5, b = 4;
//    int const * const p = &a;
    
    //const在*前, 通过指针不可以修改指向内容,指针可以重指向
    //const在*后, 指针不可以重指向,但是通过指针可以修改内容
     
    return 0;
}