【2015/10/24】C学习日志_Day 9 关键字
2015-10-26 23:17
288 查看
</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
相关文章推荐
- 文章标题
- C++Primer笔记一
- jackson学习----解析豆瓣的图书信息
- 【黑马程序员】成为一匹黑色战马,驰骋于技术的荒野之中
- android群英传读书笔记---自定义ViewGroup
- Thinking in Java 整理笔记:内部类
- FZU - 1901 Period II(KMP next数组的理解)
- 系统系统项目管理工程师20151022作业
- LeetCode:Add Digits
- C++:流类库与输入输出
- iOS-ViewController的生命周期
- pull解析xml文件
- JAVA ,Map接口 ,迭代器Iterator
- 操作系统2-进程
- 头文件的2种方式与枚举的优势
- python中一个快速求素数的function
- Android中内容观察者的使用---- ContentObserver类详解
- HDU - 2609 How many(最小表示法)
- 【转载】从键盘输入字符串并输出该字符串(汇编程序)
- lam 表达式比较