ACSII码值 | 对应字符 |
048 | 0 |
057 | 9 |
065 | A |
090 | Z |
097 | a |
122 | z |
‘[? ?]’? ?>? '? *? ' |
‘? *? ’? >? ' + ' |
‘? --> ’? >? ?' ++ ' |
‘ ++ ’? >' + ' |
?优先级:括号>赋值号>逗号
整个逗号表达式是从左向右依次执行的,表达式最终的值为最后一个语句的值
#include<stdio.h>
main( )
{ int a=1, b=1, c;
c=a++, b++, ++b; //优先级问题,逗号优先级最低
printf(“a=%d,b=%d,c=%d\n”,a,b,c);
}
运行结果:2,3,1
#include<stdio.h>
main( )
{ int a=1, b=1, c;
c=(a++, b++, ++b); //由于括号优先级高,所以c等于整个逗号表达式的值
printf(“a=%d,b=%d,c=%d\n”,a,b,c);
}
运行结果:2,3,3
两种短路情况? ? ? ? &&左侧为假,||左侧为真
int main()
{
int x,y,z;
x=y=z=-1;
++x&&++y||++z;
printf("%d,%d,%d\n",x,y,z);
运行结果:0,-1,0
int main()
{
int x,y,z;
x=y=z=-1;
++x||++y&&++z;
printf("%d,%d,%d\n",x,y,z);
运行结果:0,0,-1
int main()
{
int x, y, z;
x = y = z = -1;
++x && ++y && ++z;
printf("%d,%d,%d\n", x, y, z);
}
运行结果:0,-1,-1
#include<stdio.h>
int main()
{
int x, y, z;
x = y = z = -1;
++x || ++y || ++z;
printf("%d,%d,%d\n", x, y, z);
}
运行结果:0, 0, 0
转义字符 | 表达意义 |
%c | 字符型 |
%s | 字符串 |
%5d | 空5格输出一个整形变量 |
%.2d | 输出保留了两位小数的整形变量 |
%5.2d | 每空5格输出一个保留了2位小数的整形变量 |
\0 | 字符串的结束符 |
getchar | 从键盘输入一个字符,存入字符变量中(若一次性输入多个字符,则字符变量只获取第一个字符) |
putchar | 输出字符变量a的值 |
main()
{
char c;
c=getchar(); //getchar每次只接受一个字符
while(c!=‘?’)
{
putchar(c);
c=getchar();
}
}
?当输入abcde?fg时,可以看到c只获得了第一个字符a
当再一次getchar时,c则获取到了下一个字符b,以此类推。?
scanf函数与空格就结束输入,gets函数遇空格不会结束输入
若键盘输入为:abcde fg<CR>
int main()
{
char c[10];
scanf("%s",c); //scanf不认空格
printf("c=%s",c);
}
运行结果:c=abcde
关键:else与它上方离它最近的if配对
int main()
{
int a=2,b=-1,c=2;
if(a<b)
if(b<0)
c=0;
else //这里的else与上方if(b<0)配对
c+=1;
printf("%d\n",c);
}
运行结果:2
关键:default是指没有符合的条件就执行其后面的语句,不遇到break就一直往下执行所有分支?
#include<stdio.h>
int main()
{
int x=1,y=0;
switch(x)
{
case 1:
switch(y)
{
case 0: printf(“first\n”);break; //这里的break只是跳出switch(y)这个分支
case 1: printf(“second\n”);break;
}
case 2: printf(“third\n”); //该分支属于switch(x),所以依然要被执行
}
}
运行结果:first,third
while(a) 表示当a!=0时执行循环,其等价于while(a!=0)。
if(a) 同上
while(!a) 表示当a=0时执行循环,其等价于while(a==0)。
if(!a) 同上
特别注意:for循环若存在两个判断条件,则必须两个判断条件均为假,才能结束循环
main( )
{
int x,y;
for(x=30,y=0;x>=10,y<10;x--,y++)
x/=2,y+=2;
printf(“x=%d,y=%d\n”,x,y);
}
运行结果:x=0,y=12
#include<stdio.h>
#define F(x,y,z) x*y*z/4
main( )
{ int i=3, j=2, k=3;
printf("%d\n",F(j+i, i*++j,i+j+k));
}
x=j+i, y=i*++j, z=i+j+k
运行结果:87
#include<stdio.h>
int func(int a, int b)
{
static int m = 1,i = 3;
//static初始化只进行一次,第二次调用函数时m和i的值为上一次调用结束时的值
i += m + 1; m = i + a + b;
return(m);
}
int main()
{
int k = 4, m = 1, p;
p = func(k, m);
printf("%d", p);
p = func(k, m);
printf("%d\n", p);
}
运行结果:10 21
1.strcpy(字符数组1,字符数组2)//用字符数组2中的值替换掉字符数组1中的值
2.strlen//计算字符数组的长度(不包括\0)
3.strcmp(字符数组1,字符数组2)//比较两个字符串大小(用ASCII码值比)
4.strcat(字符数组1,字符数组2)//将字符数组2连接到字符数组1之后
strcmp函数会从字符串中的第一个字符开始,利用ASCII码依次向后进行大小比较。若1>2则返回正值,相等则返回0,否则返回负值。
升序:从小到大
降序:从大到小
void bubble_sort(int *a,int length)
{
int i=0;
for(i=0;i<length-1;i++) //外层循环,循环次数与数组长度相同
{
int j=0;
for(j=0;j<length-1-i;j++)
//每一轮循环后,最大的数便会浮到右边,因此右侧已经排好的数无需再次排序
{
if(a[j]>a[j+1])
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
此函数可实现对长度为length的数组的升序排序
void bubble_sort(int* a, int length)
{
int i = 0;
for (i = 0; i < length - 1; i++) //外层循环,循环次数与数组长度相同
{
int j;
for (j = length-1; j > i-1; j--)
//每一轮循环后,最大的数便会浮到右边,因此右侧已经排好的数无需再次排序
{
if (a[j] < a[j + 1])
{
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
该函数可完成数组的降序排序
1.数组的首地址
2.第0行第0列的地址
判断标准:只存在1个‘? *? ’或‘[? ?]’的为一级地址? ? ?
? ? ? ? ? ? ? ? ? 不止一个的即为元素值
? ? ? ? ? ? ? ? ? 而一个符号都不存在的即为二级地址
#include<stdio.h>
int main()
{
const char* p[4] = { "CHINA","JAPAN","ENGLAND","GERMANY" };
//这里其实定义了一个二维指针数组,它把每一个国家名看做一行
int i;
const char** pp;
pp = p; //pp指向二维数组第0行第0列元素的地址
for (i = 0; i < 4; i++, pp++)
printf("\n%c", *(*pp + 2) + 1);
}
难点突破:1. *与()优先级大于+,所以先执行*(*PP+2)
2. *(*pp+2)存在两个*,代表的是一个元素值,就是每一个国家名的第三个字母
3. 字母+1等价于下一个字母
运行结果:
J
Q
H
S
FILE *fp; //定义文件指针
fp=fopen(文件名,使用文件格式);
w | 只写(若文件不存在,则会创建一个文件;若文件已存在,则会自动删除其中内容) |
r | 只读(文件需要已经存在) |
a | 在已有文件中添加内容 |
w+/r+/a+ | 允许读写文件 |
fclose(fp);
fread | 读取文件中的数据 |
fwrite | 向文件中写入数据 |
注意:C语言只能处理文本类型和二进制类型的文件