底子太薄,看东西太过于马虎,到现在感觉自己不会的东西太多,也没有相对来说精通的东西。
老话说的很对,以往那些觉得以后用不上可以跳过的东西在关键时候都会跳出来给你当头一棒!固然,即使社会如此之动荡,人心如此之浮躁。踏踏实实学点东西,弄明白点东西,这才是根本。
1. C语言数据类型
1 #define SECOND_YEAR_TIME 365*24*60*60*30UL 2 #include"stdio.h" 3 #include"math.h" 4 int main() 5 { 6 printf("Total second is:%ld ",SECOND_YEAR_TIME); 7 //int x= ((sizeof(int))*8); 8 printf("the max number of int is:%f ",pow(2,32)); 9 printf("the length of int is:%d ",sizeof(int)); 10 printf("the length of char is:%d ",sizeof(char)); 11 printf("the length of long int is:%d ",sizeof(long)); 12 printf("the length of float is:%d ",sizeof(float)); 13 printf("the length of double is:%d ",sizeof(double)); 14 printf("the length of short int is:%d ",sizeof(int)); 15 printf("the length of long double is:%d ",sizeof(long double)); 16 printf("the length of unsigned int is:%d ",sizeof(unsigned int)); 17 return 0; 18 }
今天仔细看看C,竟然连这些最基本的东西都无法分辨清楚。可悲的实践能力,可笑的这么些年。
以上结果为64位机下数据类型所占位数。
2. 在宏中define函数
#define MIN(A,B) A<=B?A:B #include"stdio.h" int main() { int a=45, b=43,x=0; x=MIN(a,b); printf("the min number is: %d",x); }
这样能相对于在代码体中直接定义函数在编译时产生更优的性能结果,在嵌入式C中经常使用。
3. static int 与 const int
#include"stdio.h" int main() { static int xx=3; int sum=0; for(;;) { sum=xx++; if(sum>100) { break; } } printf("The final number occur is: %d ",sum); printf("The value of xx after the loop is %d ",xx); }
#include"stdio.h" int main() { const int xx=3; int sum=0; for(;;) { sum+=xx; if(sum>100) { break; } } printf("The final number occur is: %d ",sum); printf("The value of xx after the loop is %d ",xx); }
在C 语言中,关键字static 有三个明显的作用: 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访 问,但不能被模块外其它函数访问。它是一个本地的全局变量。 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是 ,这个函数被限制在声明它的模块的本地范围内使用。
从上面两段代码可以发现,static仅仅是在内存中保留了局部变量或者函数运行后的值,并不做销毁,这样可以方便传送给其他函数。
const则是严格指明变量的值不发生任何变化。 break则是使得程序跳出循环体,其对if语句并不起任何作用;另外break在switch语句中是必不可少的部分,如果缺少,则进入死循环。
4. 变量及指针变量的定义
#include"stdio.h" int main() { int a; //定义一个整数 int *a; // 定义一个指向整数的指针 int **a; //定义一个指向指针的指针,并且这个指针指向一个整数 int a[10]; //定义一个包含十个元素的整形数组 int *a[10]; // 定义一个包含十个指针元素的数组,每个指针指向一个整形值 int (*a)[10] //定义一个有十个整形数组值的指针 int (*a)(int) //定义一个指向函数的指针,该函数至少一个整形参数且返回一个整数 int (*a[10])(int) //定义一个由十个指针的数组,该指针指向一个函数 }
5. const用法进阶
#include"stdio.h" int main() { const int a=0; // 正确 int const b; b =0; // 错误 int a=100,b=1000,*p,*t; const int (*p=a); int const (*t); p+=8; // 正确,指针可以修改,但是指向的整数是不可以修改的 *t=3; // 错误 int* const p; // 常量指针,指向的整数可以修改,但是指针不可修改 int const * a const; // 整数不可以修改,同时指针也不可修改 }
6. voliaile
定义为volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
1>告诉compiler不能做任何优化。
2>用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。
7. int 与usigned int
#include<stdio.h> #include"string.h" int main() { int k=-1; printf("%d,%u",k,k); }
下图为程序运行结果与2^32次方计算结果。
8. 逻辑运算值对式子的影响
#include<stdio.h> #include"string.h" int main() { int a=5,b=6,c=7,d=8,m=2,n=2; int x=(m=a>b)&&(n=c>d); printf("逻辑表达式的值为:%d ",x); printf("程序运行后n的值为:%d ",n); printf("程序运行后m的值为:%d ",m); }
程序运行结果为:
因为运算符&&是一种短路运算符,前面的一个条件(m=a>b)为假,所以不会去执行后面的判断条件,因而后面语句根本没有执行,故n=2,而m=0.
9. 二维数组的指针
#include<stdio.h> int main() { int a[][3]={10,20,30,40,50,60}; // 1行2列的地址:a[1]+2,*(a+1)+2,&a[1][2] // 1行2列的值: *(a[1]+2),*(*(a+1)+2),a[1][2] printf("the first number is: %d",*(*(a+1)+2)); }
a[1]代表第二行的首地址,+2代表右移两位。每一行代表一个班,整个数据表代表一个排,排长每次检查一个班,即从a-》a+1,跳过的元素为一个班的数量;而班长每次检查的元素数量仅为一个班的元素,即(a+1)+2代表这个班中的第三个元素。
10. 位操作
以下代码利用位操作实现对a的第三位置1,以及清0操作。
#include<stdio.h> #define BIT3 (0x01a<<3) // 0x前缀代表十六进制;0前缀代表八进制;没有前缀代表十进制 int main() { static int a=120; // 二进制为:01100100 printf("BIT3的值为:%d ",BIT3); a |=BIT3; printf("a的bit3设置为1后的值为:%d ",a); a &=~BIT3; printf("a的bit3清除后的值为:%d ",a); }
11. break 和 continue
在while循环,do...while循环和for循环中,可以用break语句跳出循环,用continue语句结束本次循环。
而对用goto语句和if语句构成的循环,不能用break和continue语句进行控制。
break用于跳出循环,continue用于结束本次循环,并非终止整个循环。
12.冒泡排序
#include<stdio.h> int main() { int a[10],temp; int i,j,k,l; printf("请输入十个需要排序的数: "); for(i=0;i<10;i++) { scanf("%d",&a[i]); } for(j=0;j<10;j++) { for(k=0;k<j;k++) { if(a[j]<a[k]) { temp=a[k]; a[k]=a[j]; a[j]=temp; } } } printf("冒泡排序后的顺序为: "); for(l=0;l<10;l++) { printf("%d ",a[l]); } }
13.字符串的读取和输出(C中)
#include"stdio.h" #include"string.h" int main() { char b[100]; gets(b); printf("输入的字符数组为: "); puts(b); }
14. C和C++中除数为0
C语言:不报错,运行时程序异常。
#include"stdio.h" int main() { int a=100,b=0; int c=a/b; printf("输出的除法结果为:%d ",c); }
C++语言:同样不报错,运行程序异常。
15. strcatstrcpystrncpy的用法
strcat的数组1定义的长度必须足够大,以便能容纳链接后的新字符串,否则会出现问题----实验中不断输出链接后的语句,并非正常输出一句后停止。
#include"stdio.h" #include"string.h" int main() { char str1[30]={"People's Republic of China"};// 长度为30的时候会报错,40或更大则正常输出 char str2[15]={"Mao ZeDong"}; printf("%s ",strcat(str1,str2)); }
strcpy(str1,str2) 同样也是将str2的内容复制到str1中,且1的数组大小必须足够大。
strncpy(str1,str2,n)将str2中最前面的n个字符复制到str1中,取代str1中原有的最前面n个字符;复制的字符数不应该多与str1中原有的字符数。
16. strcmpstrlenstrlwrstrupr的用法
printf("%d ",strcmp(str1,str2));
strcmp: 如果str1=str2,则函数值为0; 如果str1>str2,则返回值为一个正数; 如果str1<str2,则返回值为一个负数。
比较的规律:英文字典中位置靠后的为大,例如computer>compare; 小写字母比大写字母大,例如:DOG<dog;空格的作用:str 1<str1;
中文字符:也是按照ascii码值来进行比较;
数字: 直接比较大小,大于返回1,小于返回-1.
strlen: 函数值为字符串实际长度,不包含' ',但是包含空格。
printf("%d ",strlen(str1));
strlwrstrupr则是直接将字符串变为全部小写或者全部大写:
printf("%s ",strlwr(str1)); printf("%s ",strupr(str1));
17.统计单词的个数代码
#include"stdio.h" #include"string.h" int main() { char a[100]; int i,num=0,word=0; printf("请输入一段文字: "); gets(a); printf("输入的字符段为:%s ",a); printf("输入的字符段长度为:%d ",strlen(a)); for(i=0;a[i]!='