【2015/10/24】C学习日志_Day 9 关键字

</pre><pre name="code" class="cpp">    > File Name: main.c
    > Author: khalil
    > Mail: hsgwpj@gmail.com
    > Created Time: Sat 24 Oct 2015 8:56:56 AM CST
 ************************************************************************/


//查找: GCC加什么参数可以优化编译方式
//表查找
//看《程序员的自我修养》
//贝叶斯算法




#if 0
#include<stdio.h>
int main (int argc , char ** argv)
{
    //输入任意字符串,统计\n\t空格的数量


    char str1[128] = {0};
    char *p = str1;
    int i = 0 ;
    int j = 0 ;
    char ch  = '\0';
    int n_count = 0;
    int t_count = 0;
    int s_count = 0;


    printf("请输入字符串,按<C-d>退出:\n");
    for ( i = 0 ; i < 128 && ch != EOF ; ++i )
    {
        ch = getchar();
        str1[i] = ch;
        switch (ch)
        {
            case '\n': n_count++;
                       break;
            case '\t': t_count++;
                       break;
            case ' ' : s_count++;
                       break;
            default  : break;
        }


    }
    str1[i-1] = '\0';




    printf("\n你输入的字符串为:\n%s\n",p);
    printf("你输入的\\n,\\t,空格分别为:%d %d %d \n",n_count,t_count,s_count);
    return 0 ;


}
#endif


#if 0
//Unicode 有65535种编码(2^16)
#define LENGTH  (256)
#define ZERO    (0)


#include<stdio.h>
int main ( int argc , char ** argv )
{
    //空间换取时间:
    //
    //      时间的宝贵程度一般是大于空间的
    //
    //      256种字符,
    //
    //      int ASCII_count[256] = {0};
    //
    //      //记录各个字符出现的次数
    //      a   97  ASCII_count[97]++ ; // 0  --> 1
    //      A   65
    //      0   48
    //      \n  10
    int i = 0 ;
    int ASCII_count[LENGTH] = {0};
    char ch  = 0;


    printf("请输入任意字符,<C-d>结束:\n")


    while ((ch = getchar()) != EOF)
    {
         ASCII_count[ch]++;
    }


    for ( i = 0 ; i < LENGTH ; ++i )
    {
        if( ASCII_count[i] != ZERO )
        {
            printf("\n字符 %c 出现了\t%d\t次\n",i,ASCII_count[i]);
        }
    }


    return 0;
}


#endif


#if 0
//素数的处理可以采用筛法
#endif


#if 0
/*
 *  介绍C语言中的关键字
 *
 *
 */
#include<stdio.h>
#include<time.h>


void func1(void);


void func1(void)
{
    auto int a = 10;    //等价于 int a = 10;
}


//register int global_value           = 0;


//static register int static_value    = 0;


void func2(register int i);


void func2(register int i)
{
    printf("i = %d\n",i);
}
int main ( int argc , char ** argv )
{
    //auto 自动变量
    //《程序员的自我修养(编译、链接和库)》
    int a = 10 ;    //由函数内部定义的变量,该变量存在于栈上,
                    //生存周期为函数调用时定义,函数调用结束时被释放
    func1();


    register int i = 0 ;     //计数器
//  int i = 0;              //存在寄存器中的变量会比自动变量快一个数量级
                            //
                            //尽量把变量存在寄存器中提升运行速度 但是有空间限制
                            //
                            //register 有修饰限制:
                            //
                            //1.自动变量    可以
                            //2.静态变量    不可以
                            //3.全局变量    不可以
                            //4.函数参数    可以
                            //


    //寄存器变量不能直接取址
    int *p = &i;
    *&i = 233;
    printf("%x\n",i);
    printf("%x\n",p);




    clock_t  start = 0;     //long long int 类型
    clock_t  end   = 0;     //使用clock()进行CPU记时来比较寄存器变量和自动变量的
                            //区别


    start = clock();


    for ( i = 0 ; i < 1000000000 ; ++i )
    {
         //do something;
    }


    end = clock();


    printf ("%lf\n", (double)(end - start)/CLOCKS_PER_SEC) ;


    func2(i);
    return 0 ;
}






#endif


#if 0
#include<stdio.h>


void func1(void);
void func2(void);


void func1(void)
{
    int a = 0;
    a++;
    printf("a = %d\n",a);


}


void func2(void)
{
    static int b = 0;
    b++;
    printf("b = %d\n",b);
}


///
void func3(void);
static void func4(void);
void func3(void)
{
    ;
}
static void func4(void)
{
    ;
}


int main ( int argc ,char **argv )
{
    //static 静态
    //
    //1.可以修饰变量:
    //      (1)静态全局变量:
    //          static 全局变量和普通的全局变量有什么区别?
    //          (1)二者都先于主函数创建;
    //          (2)生命周期贯穿整个程序;
    //          (3)都存在于内存的静态区;
    //          (4)区别: 全局变量可以被外部.c文件识别使用,而静态局部变量
    //               只能被本文件使用(而且是从它定义的位置向下开始);
    //
    //          ---疑问: 链接到底做了什么? key_word:符号表;
    //
    //      (2)静态局部变量:
    //          在函数内定义
    int i = 0;
    for ( i = 0 ; i < 10 ; ++i )
    {
         func1();
         func2();
    }




    //2.static可以修饰函数:
    //      (1)没加static的函数:可以被其他.c文件识别
    //      (2)static函数:只能在本文件使用
    //


    return 0 ;
}
#endif


#if 0
//编程实现: int ftoi(float value);
//eg:
//  int  result = ftoi(12.5)        //result = 12 float转换为int类型
#include<stdio.h>
//浮点数的位存储形式:
//
//  12.25 => 1100.01(二进制) = 1.10001 * 2^3 (二进制科学技术法)
//           2*3+ 2*2 + 2^-2
//
//      3       -> 指数位
//      10001   -> 尾数
//      0       -> 符号位
//
//规则如下:
//  12.25:
//  0 0000001 |1
//    1111111 |1
//  0 1000001 |0 10001 00 |00000000 |00000000
//  f zzzzzzz |z wwwww ---|----补零-|--------
//  f符号位 z指数位 w尾数位
//  (1)左1位符号位,正数0,负数1
//  (2)指数位占8位 如果是正数 需要加127
//  (3)尾数位32-1-8=23位


int ftoi(float value)
{
    ;
}


int main ( int argc , char **argv )
{
    float a = 12.25;
    printf("ftoi的结果是:%d\n",ftoi(a));
    return 0 ;
}






#endif


#if 0
#include<stdio.h>
#include<string.h>
int main (int argc , char ** argv)
{
    int a = 10;


    printf("the size of :%d\n",sizeof     (int)   );
    printf("the size of :%d\n",sizeof     (a)     );
//  printf("the size of :%d\n",sizeof     int     );    //错误的
    printf("the size of :%d\n",sizeof     a       );
//sizeof 得到unsigned int   它是关键字 不是函数


    char str1[] = "hello,world";
    char *str2  = "hello,world";


    printf("strlen : %d \n",strlen(str1));  // 1. 11
    printf("sizeof : %d \n",sizeof(str1));  // 2. 12
                                            //sizeof要多计算'\0'这一位!
    printf("strlen : %d \n",strlen(str2));  // 3. 11
    printf("sizeof : %d \n",sizeof(str2));  // 4. 8


    return 0;
}
#endif


#if 0
//实现strlen
#include<stdio.h>
size_t strlen(const char *p)
{
    register int i = 0;
    for ( ; *p++ != '\0' ; ++i )
        ;
    return i;
}


int main ( int argc , char ** argv )
{
     char * str = "hello,world!";
     printf("%d\n",strlen(str));
     return 0;
}
#endif




#if 0
#include<stdio.h>
float sum_float_elements(float *arr,unsigned int length)
{
    int i = 0;
    float result = 0.0;
    for(i = 0; i <= length - 1; ++i){
        result += arr[i];
    }
    return result;
}


int main (int argc , char ** argv)
{
    //类型提升问题:一般来讲,signed类型遇到unsigned类型
    //              会提升为unsigned类型
    //
    //
    float array[] = {12.4,2.5,0.6,23.23,12.44,50.6};
    float result = sum_float_elements(array,6);
//  float result = sum_float_elements(array,0);
//  如果把最后的参数改为0
//  unsigned类型的第二个参数会变为0-1后的unsigned int 的最大值
//  导致数组越界


//  *建议:尽量使用有符号的类型


    printf("result = %f\n",result);
    return 0 ;
}
#endif


#if 0
#include<stdio.h>
int main ( int argc , char **argv )
{
    ;                       //空语句
    8 + 3 ;                 //表达式


    int a = 10;
    float c = 5.6;
    float f = 5.6;
    double d = 7.5;
    int *p = &a;


    //顺序执行的语句
    //1.
    //
    //分支语句
    //
    if(/*表达式*/1){
        //do sth.
    }else{
        //do sth.
    }
    //推荐使用的形式
    //
    //switch () 的优化 <- GCC 加什么参数可以以表查询
    //
    //switch cases中的值不连续的时候 编译器会生成一个二叉树进行查找
    //
    //
    return 0;
}
#endif


#if 0
#include<stdio.h>
#include<stdlib.h>


#define TRUE  (1)
#define FALSE (0)


typedef unsigned char Boolean;


Boolean func1(void);
Boolean func2(void);
Boolean func3(void);


Boolean func1(void)
{
    return FALSE;
}
Boolean func2(void)
{
    return FALSE;
}
Boolean func3(void)
{
    return FALSE;
}


int main (int argc , char **argv )
{
    Boolean ok = TRUE;
    int *p_int = NULL;


    //申请内存资源
    p_int = (int *) malloc (sizeof(int) * 10);
    if (p_int == NULL){
        printf("The memory is full!\n");
        exit(1);
    }
    #if 1           //连续检测调用函数的返回值 ver.final
                    //&&的短路运算
    if (func1() == TRUE
    &&  func2() == TRUE
    &&  func3() == TRUE){
        ;
    }
    free(p_int);
    #endif
    #if 0 //连续检测调用函数的返回值 ver.2
    do{
        if ((ok = func1()) == FALSE){
            break;
        }
        if ((ok = func2()) == FALSE){
            break;
        }
        if ((ok = func3()) == FALSE){
            break;
        }
    }while(0);


    free(p_int);
    #endif
    #if 0 //连续检测调用函数的返回值 ver.1
    //分别调用函数
    ok = func1();
    if (ok == FALSE){
        free(p_int);
        exit(12);
    }


    ok = func2();
    if (ok == FALSE){
        free(p_int);
        exit(1);
    }


    ok = func3();
    if (ok == FALSE){
        free(p_int);
        exit(1);
    }


    free(p_int);
    #endif
    return 0 ;
}
#endif


#if 0
#include<stdio.h>
//break continue语句
int main ( int argc , char ** argv )
{
    int array [100] = {0};
    int i = 0;
    int j = 0;


    for ( i = 0 ; i <100 ; ++i ){
        for ( j = 0 ; ; < 100 ; ++j ){
            if ( i > 50 ){
               break ;    //break跳出最近的一层循环语句
            }
        }
    }
    //或者配合switch case---


    for ( i = 0 ; i <100 ; ++i ){
        for ( j = 0 ; ; < 100 ; ++j ){
            if ( i > 50 ){
               continue ;   //continue跳出本次循环,进入下一次循环
            }
            printf("I do not continued!\n");
        }
    }




}


#endif




#if 0
// goto
#include<stdio.h>
#include<stdlib.h>


#define TRUE  (1)
#define FALSE (0)


typedef unsigned char Boolean;


Boolean func1(void);
Boolean func2(void);
Boolean func3(void);


Boolean func1(void)
{
    return FALSE;
}
Boolean func2(void)
{
    return FALSE;
}
Boolean func3(void)
{
    return FALSE;
}


int main (int argc , char **argv )
{
    Boolean ok = TRUE;
    int *p_int = NULL;


    //申请内存资源
    p_int = (int *) malloc (sizeof(int) * 10);
    if (p_int == NULL){
        printf("The memory is full!\n");
        exit(1);
    }


    if ((ok = func1()) == FALSE){
         goto FAILED_FUNC;
    }


    if ((ok = func1()) == FALSE){
         goto FAILED_FUNC;
    }


    if ((ok = func1()) == FALSE){
         goto FAILED_FUNC;
    }


    free(p_int);
    return 0 ;




FAILED_FUNC:
    free(p_int);
    exit(1);


}
#endif


#if 0
#include<stdio.h>
//无返回类型的函数默认返回为int?
sum (int a ,int b);


sum (int a ,int b)
{
    return a + b;
}


int main ( int argc, char **argv )
{
    // void a ;     //X -> 编译器无法获得分配内存的大小
    void * p ;      //V -> 指针在32位下4字节 64位下8自己
    //它可以接受任意类型指针,是泛型编程的基础!
    //


    int result = 0 ;
    result = sum (10 , 20);


    printf("result = %d\n",result);




    return 0 ;
    //return 在void类型中可以作为break使用*
}
#endif


#if 0
#include<stdio.h>


int main (int argc , char **argv)
{
    volatile int i = 10;
    //忽略编辑器的优化,每次对变量的访问都从变量的地址读取
    //安全, 防止多线程操作时的误操作
    int j = i ;
    int k = i ;
    return 0 ;
}
#endif


#if 0
#include<stdio.h>


typedef struct List_node{
    int data;
    struct List_node *next;
}List_node;


typedef void(*Swap)(void *a , void *b);


//typedef void(*)(void *a , void *b)  Swap;     //<= 编译器会报错
// 一个意思-> 函数指针,Swap类型的变量可以指向形如
// void func(void *a, void *b)的函数


void func1(void *a , void *b);
void func1(void *a , void *b)
{
    ;
}




int main ( int argc ,char ** argv )
{
    Swap swap = func1;
    struct List_node a;
    List_node b;
    //一个意思
    //
    return 0;
}
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值