2010.1.x 1 printf() '-'是左对齐; 小数点‘.’也占一位 eg: %8.3f 整数占4位,小数点1位,小数3位, 整数不够位补空格,超过照样输出, 小数不够补O,超过位四舍五入. %08.3f 和 %08d,整数不够位补0 2 scanf不能格式化输入,只能用一个 整数 指定输入的总位数 scanf("%8f",a); 无论getchar()输入多少,只收下第一个字符; scanf("%c",C);输入多少个字符,只收下第一个字符 3 eg: swith()内,没有符合的case就直接跳过,什么都不做; #include <stdio.h> main() { char s[100]; int c,i; scanf("%c",&c); scanf("%d",&i); scanf("%s",s); printf("%c\n",c); printf("%c,%d\n",c,i); printf("%c,%d,%s\n",c,i,s); } //输入123 456 789 //输出1 // 1,23 // 1,23,456 //c只能放一个字符,第一个字符1, //23被输入整数的i收下,遇到空格scanf停止输入 //456被s[100]收下,遇到空格scanf停止输入 //导致789没人要 4. #include <stdio.h> #include <string.h> main() { char a[] = {'a','b','c','d','e','f','g','h','\0'}; int i,j; i = sizeof(a); j = strlen(a); printf("%d,%d",i,j); } 输出 i = 9 j= 8 strlen不算‘\0’ #include <stdio.h> #include <string.h> main() { char a[30] = {'a','b','c','d','e','f','g','h'}; char b[30] = {'1','\0','2'}; int i,j; i = sizeof(a); j = strlen(a); printf("%d,%d",i,j); } 输出 i = 30 j= 8 strlen不算‘\0’ #include <stdio.h> #include <string.h> main() { char a[30] = {'\0','b','c','d','e','f','g','h'}; int i,j; i = sizeof(a); j = strlen(a); printf("%d,%d",i,j); } 输出 i = 30 j= 0 strlen不算‘\0’,遇到'\0'停止 #include <stdio.h> main() { char a[30] = {'a','b','c','d','e','f','g','h'}; int i,j; for(i = 0;i < 30;i++) printf("%c\n",a[i]); } 输出abcdefgh后面的都为a int,char数组后没没赋值的,遇到%c输出a,遇到%d输出0 5 if ((c = getchar()) != 0) getchar一定要加(),否则先!=再= 背运算符优先级表 6 #include <stdio.h> main() { int a[2]; printf("%d",a[3]+1); } 不会编译错误 另外定义数组a[i] ( i>0且不能为空 ),否则编译错误 7 stcmp(A,B)比较字符A>B返回正数,A=B返回0,A<B返回负数(比较ASCII比较第一个对不同字符,这两的字 符决定大小) 8 #include <stdio.h> main() { int y = 1; printf("%d,%d",y,++y); } 输出2,2 C语言函数参数计算次序从右向左(←) #include <stdio.h> func (int a, int b) { int c; c = a + b; return c; } main() { int x = 6,r; r = func (x,x+=2); printf("%d",r); } 输出16 C语言函数参数计算次序从右向左(←) 9 fff(float x) { printf("%d",x); } fff是int类型 10 #include <stdio.h> int fun(int a, int b, int c) { c = a * b; return c; } void main() { int c; fun(2,3,c); printf("%d",c); } 输出不定值,因为fun中的c传不出去,c不变(C语言 数据只能从实参传递给形参,而形参的数据不能传递给实参) 可以改成 #include <stdio.h> int fun(int a, int b, int c) { c = a * b; return c; } void main() { int c; c = fun(2,3,c); printf("%d",c); } 输出6 11 #include <stdio.h> void main() { extern int c; printf("%d",c); } int c = 0; 输出0 12 #include <stdio.h> func (int a, int b) { static int m = 0,i = 2; //表面上进了2次 i += m + 1; m = i + a + b; return m; } main() { int k = 4,m = 1,p; p = func(k, m); printf("%d,",p); p = func(k, m); printf("%d",p); } 输出8,17 内部静态变量在第一次进入包含它的函数复制后,以后再进入该函数的赋初值语句不起作用 13 #include <stdio.h> int fun(int x) { printf("%d\n",x); x *= 10; return x; } void main() { int a = 1; printf("%d",fun(a++)); } 输出1 10 a = 2; #include <stdio.h> int fun(int x) { printf("%d\n",x); x *= 10; return x; } void main() { int a = 1; fun(a++); printf("%d",a); } 但这样就输出1,2,因为形参不能传给实参 #include <stdio.h> int fun(int x) { printf("%d\n",x); x *= 10; return x; } void main() { int a = 1,c; c = fun(a++); printf("%d",c); } 输出1 10,可用一个变量装着先 14 全局变量有效范围是定义变量开始到本文件结束 static 类型 函数名() 内部函数又称静态函数,只局限于所在的文件,在不同文件中有同名的内部函数,互不干扰 类型 函数名() 函数定于省略extern,默认为外部函数 函数实参:1实参可以是常量,变量,表达式 2实参与形参的类型应相同或赋值相容 3实参变量对形参变量的数据传递是“值传递”,即单向传递.只由实参传给形参,不能由形参传给实参.在内存中,实参单元与形参单元是不同的单元,在调用函数时,给形参分配存储单元,并将实参对应的值传给形参,调用结束后,形参单元被释放,实参单元保留. 外部变量作用范围是本程序的全部范围,static声明的外部变量,作用范围只在本文本,不能被其他文件引用 15 #include <stdio.h> int x; void main() { void addone(),subone(); x = 1; printf("%d\n",x); addone(); subone(); subone(); addone(); addone(); printf("%d\n",x); } void addone() { x++; printf("%d\n",x); } void subone() { x--; printf("%d\n",x); } 因为x是全局变量输出1210122 16 对于多维数组 eg: int c[3][4],*p; //c是二维数组 c 是数组的首地址,第0行的首地址( c[0] 表示 &c[0][0] ) c+1 是数组的 c[1] 的地址,第1行的首地址( c[1]表示&c[1][0] ) 第0行第1列的地址用 c[0]+1 表示 c[i] 和 *(c+i) 是等价的都表示地址 &c[i][0] c[i]+j 和 *(c+i)+j 都是 &c[i][j],表示第i行第j列的元素的地址 所以c, c+i, c[i], *(c+i)+j, c[i]+j 都是地址, *(c[i]+j), *(*(c+i)+j) 是元素的值 c 二维数组名,数组首地址,0行首地址 c[0], *(c+0), *c 第0行第0列元素地址 c+1, &c[1] 第1行首地址 c[1], *(c+1) 第1行第0列元素地址 c[1]+2, *(c+1)+2, &c[1][2] 第1行第2列元素地址 *(c[2]+2),*(*(c+2)+2), c[2][2] 第2行第2列元素值 17 #include <stdio.h> void main() { char *str = {"china"}; str = str + 2; printf("%s",str); } 输出ina #include <stdio.h> void main() { char str[] = {"china"}; str = str + 2; printf("%s",str); }编译错误 18 char str[20]; str = "China"; 编译ok char *s; s = "China"; 编译ok char s[30]; s[] = "China"; //字符数组在定义时整体初始化,在赋值语句中不能完成整体赋值 编译错误 19 char s[10]; scanf("%s",s); 编译ok char *s; scanf("%s",s); 编译错误 危险s单元不可预料,指向不明 char *a,s[10]; a = s; scanf("%s",a); 编译ok 20 int a = 3, b = 2, c = 1; d = (a>b>c); 输出d为0 因为a>b布尔值为1,1>1布尔值为0,只要c>0→d=0 21 int (*prt)[3]是一个指针,指向一个具有3个元素的一维数组 int *prt[3]是一个指针数组 #include <stdio.h> void main() { int **k,*a,b=100; a = &b; k = &a; printf("%d\n",b); printf("%d\n",*a); printf("%d\n",**k); } k a b □ → □ → □ *a 引用变量b的储存单元 (&b), *a 就是 b *k 引用变量a的储存单元 (&a), *k 就是 a **k 即 *(*k) 是 *a也是 b 22 #include <stdio.h> void main() { int *a = 0,*b = 0; *a = 10; *b = 20; } 编译没错,运行出错.因为a,b是空指针 char ch,*p = &ch; scanf(“%c”,p); *p = ‘A’; printf(“%c”,*p); //注意是*p,取值 23 返回指针的函数 类型名 *函数名(参数表) eg: int *fun(int a,int b); 指向函数的指针 类型名 (*指针变量名)(); eg: int (*fun)(); 对指针函数的指针变量++s,--s,s+3是没有意义的 24 #include <stdio.h> #define SQR(X)X*X void main() { int a = 10,k = 2,m = 1; a /= SQR(k+m)/SQR(k+m); printf("%d",a); } 输出为1 因为宏进行的是简单的替换a/=X*X/X*X; 再替换成a/=k+m*k+m/k+m*k+m; 10/(2+1*2+1/2+1*2+1)=10/7=1; 改正: #include <stdio.h> #define SQR(X)(X*X) void main() { int a = 10,k = 2,m = 1; a /= SQR(k+m)/SQR(k+m); printf("%d",a); } 输出10 #include <stdio.h> #define SQR(X)X*X void main() { int a,k = 3; a = ++SQR(k+1); printf("%d",a); } 输出9 因为a = ++k+1*k+1 = 9 #define MIN(x,y) (x)<(y)?(x):(y) void main() { int i = 10,j = 15,k = 10*MIN(i,j); printf("%d",k); } 输出15 因为k = 10*(x)(y)?(x):(y) = 15 25 #include <stdio.h> void fun(float *p1,float *p2,float *s) { s = (float *)calloc(1,sizeof(float)); *s = *p1 + *p2++; } void main() { float a[2]={1.1,2.2},b[2] = {10.0,20.0},*s = a; fun(a,b,s); printf("%5.2f",*s); } 输出1.10 因为fun()中已经给 s 重新赋了新地址,此后的*s赋值与主函数的数组a无关,形参数据传不回实参,s不变. 26 #define N 6 #include <stdio.h> main() { char c[N]; int i = 0; for( ;i<N;c[i]=getchar(),i++); for(i=0;i<N;i++) putchar(c[i]); } 输入ab<回车> c<回车> def<回车> 输出 ab c d 0 1 2 3 4 5 a b \n c \n d ('\n'ACSII = 10 = 回车 ) 27 int x = 1,y = 10; x^=y; y^=x; x^=y; printf("%d,%d",x,y);//输出10,1 等价与x,y交换 28 #define POWER(x) ((x)*(x)) main() { int i = 1; while(i<=4) printf("%d",POWER(i++)); printf("\n"); } 输出19 因为POWER (i++) = ((i++)*(i++)) i→1*1→3*3 #define PRINT(x) printf("%d\n",x) #include <stdio.h> main() { int x=1,y=1,z=0; x = x&&y||z; PRINT(x); PRINT(x||!y++&&++z); //y和z的变换传不出去 PRINT(y); //y不变 PRINT(z); //z不变 x = y = 1; z = x++ - 1; PRINT(x); PRINT(z); z += -x++ + ++y; PRINT(x); PRINT(z); PRINT(y); } 输出1 1 1 0 2 0 3 0 2 29 #include <stdio.h> union un { int i; char c[2]; }; void main() { union un x; x.c[0] = 10; x.c[1] = 1; printf("\n%d",x.i); } 输出266,c[0]位于低字节,c[1]位于高字节, x.i = x.c[1] * 256 + x.c[0] = 266. 30 #include <stdio.h> void main() { union { int i[2]; long k; char c[4]; }r,*s = &r; s->i[0] = 0x39; s->i[1] = 0x38; printf("%x\n",s->c[0]); } 输出39 因为共用体变量中,所有成员共用存储空间 c[0] 和 i[1] 的低八位共用一个字节 31 #include <stdio.h> typedef union { long i; int k[5]; char c; } DATE; struct data { int cat; DATE cow; double dog; }too; DATE max; main() { printf("%d\n",sizeof(struct data) + sizeof(max)); } 输出52 52 = (20+4+8)+(20) 32 #include <stdio.h> union change { char c[2]; int i; }un; main() { un.i = 26984; printf("%d,%c\n",un.c[0],un.c[0]); printf("%d,%c\n",un.c[1],un.c[1]); } 输出 104,h 105,i 因为26984 = 0110, 1001, 0110, 1000 B c[1]=104(' i ') | c[0]=105(' h ') 33 #include <stdio.h> union pw { int i; char ch[2]; }a; void main() { a.ch[0] = 13; a.ch[1] = 0; printf("%d\n",a.i); } 输出13 34 #include <stdio.h> main() { union { int i[2]; long k; char c[4]; }t,*s = &t; s->i[0] = 0x39; s->i[1] = 0x38; printf("%lx\n",s->k); printf("%c\n",s->c[0]); } 输出39 9 printf("%lx\n",s->k);是16进制输出 39 printf("%c\n",s->c[0]);0x39 = 十进制的59,ACSII57 = 9 35 #include <stdio.h> main() { static struct s1 { char c[4],*s; }s1 = {"abc","def"}; static struct s2 { char *cp; struct s1 ss1; }s2 = {"ghi","jkl","mno"}; printf("%s,%s\n",++s2.cp,++s2.ss1.s); } 输出hi,no s2分别指向h,n开始,cp,s是指针 36 #include <stdio.h> union ks { int a; int b; }; union ks s[4]; union ks *p; main() { int n = 1,i; for(i=0; i<4; i++) { s[i].a = n; s[i].b = s[i].a + 10; n +=2; } p = &s[0]; printf("%d,",p->a); printf("%d",++p->a); } 输出11,12因为ks是共用体,s[i].b覆盖原先s[i].a的值 37 #include <stdio.h> main() { int b[] = {1,2,3,4},y,*p = b; y = *p++; printf("%d",y); printf("%d",*p); } 输出1 2 *p++ = (*p)++ 先赋值在++ 38 #include <stdio.h> main() { char *p = "abcdefgh",*r; long *q; q = (long*)p; q++; r = (char*)q; printf("%s",r); } 输出efgh char 1字节 long 4字节 ,q++跳了4个char=1个long 39 main() { char a[2][5] = {"1234","5678"},b[2][5] = {"12345","5678"}, c[2][5] = {"123456","6"}; printf("%d\n",strlen(a)); printf("%d\n",strlen(b)); printf("%d\n",strlen(c)); } 输出4 9 6 40 #include <stdio.h> main() { char ch[2][5] = {"6937","8254"},*p[2]; int i,j,s = 0; for(i=0; i<2; i++) p[i] = ch[i]; for(i=0; i<2; i++) for(j=0; p[i][j]>'\0'; j+=2) s = 10*s + p[i][j] - '0'; printf("%d",s); } 输出6385 隐含ch[2][5] = {"6937\0","8254\0"}; ↑ ↑ ↑ ↑ ↑ ↑ 跳出 跳出 41 #include <stdio.h> void main() { int i; for(i=0; i<7; i++) putchar(*("ABCDEFG"+i)); printf("\n*****************\n"); for(i=0; i<7; i++) putchar("ABCDEFG"[i]); printf("\n*****************\n"); for(i=0; i<7; i++) printf("ABCDEFG\n"+i); printf("\n*****************\n"); for(i=0; i<7; i++) printf("%c\n","ABCDEFG"[i]); printf("\n*****************\n"); for(i=0; i<7; i++) printf("%c\n",*("ABCDEFG"+i)); printf("\n*****************\n"); for(i=0; i<7; i++) printf("%s\n","ABCDEFG"+i); }