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);
}