提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
C语言基础知识
第一章 C语言概述
第二章 数据类型及其运算
第三章 顺序结构
第四章 选择结构
第五章 循环结构
第六章 函数
第七章 数组
第八章 指针
第九章 字符串
第十章 变量的作用域与存储类
第十一章 编译预处理
第十二章 结构体与共用体
第十三章 位运算
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
1、进位计数制
(D)十进制 ——无下标,默认十进制
(B)二进制 二进制转十进制:8421
(O)八进制
(H)十六进制
2、非十进制转为十进制
规则:按权展开计算
方法:
3、十进制转为非十进制
方法:
ASCII码
:美国信息交换标准码采用7位二进制
进行编码
0000000B~1111111B
ASCLL码范围:0~127 共128个编码
大写转小写:大写ASCLL+32=小写ASCLL
小写转大写:大写ASCLL-32=小写ASCLL
1、由高级语言编写的程序称为源程序
2、由C语言编写的程序扩展名为.c
(源文件/程序),经过编译后生成文件的扩展名为.obj
(目标文件/程序),经过链接后生成文件的扩展名为.exe
(可执行文件/程序)。
.c————(编译)————→.obj————(链接)————→.exe
(编辑————编译————链接————执行)
3、C语言源程序的执行过程为:编译
和链接
。
C语言是一种结构化的程序设计语言,它提供了三种基本结构语句,结构化程序通常由三种基本结构
组成,包括顺序结构、选择/分支结构、循环结构
。
C程序的特点:
函数组成
,函数
是组成C程序的基本单位
。一个程序中包含1~多个函数。主函数
开始执行,由主函数
开始执行,由主函数
结束,主函数的位置是任意的
。分号
代表结束。语句
是组成C程序的最小单位
。一条
或多条
语句,一条语句也可写成一行或多行。//
/* */
1、标识符的组成:
字母
、数字
和下划线
祖成开头不能是数字,标识符区分大小写
2、 标识符的分类
选项中既有关键字,又有用户标识符,优先选择用户标识符
。
关键字:32个均为小写字母
,例:int
预定义标识符:
scanf(输入函数)、printf(输出函数)、
include(文件包含)、define(宏定义)
用户标识符:C语言关键字不能用于用户标识符
1、基本数据类型
整型
、实型(浮点型)
、字符型
。1、整型常量
%d
十进制:345,-345%o
八进制:023,065(前导0)
%x
十六进制:0x123,0Xabc(前导0x或0X)
2、整型变量
未赋值的变量默认为随机值
%d输出:整型变量只接受整型部分
2
个字节;VC系统占4个字节1、实型常量
小数点式:
由数字、正负号、小数点组成。
eg:0.11;-5.0;-.23
组成规则:
(1)必须有小数点;
(2)小数点至少一边有数字。
指数形式:
由E或e组成
eg:12.34E+2→12.34*10^+2;-3.e+2;
组成规则:
(1)E/e左右两边都要有数字;
(2)指数部分必须是整数(E/e的右边为整数)
严格要求的E/e左边如果是小数点式的话,小数点左侧必须有且只有一位非0值。
2、实型变量
%f:实型小数,保留6位小数
(不足6位补0,超过6位四舍五入)
实型变量未说明情况下默认double型
例:(看字节数最大的
)
设int x;float y;double z;,则表达式x*z-y的值的类型是double
1、字符常量
(1)常规字符常量:‘a’、'6’单引号括起一个字符
(2)转义字符常量:
‘\n’:回车换行
‘\t’:横向跳格(Tab)'\t'跳八列
,\t加上\t前所有字符共8位,用空格补齐。
‘\b’:左移覆盖
‘r’:回车(光标回到行首,并不换行)
‘\’:反杠\
‘\’’:单引号'
‘\‘’’:双引号"
‘\ddd’:1~3位八进制整数表示的1个字符
‘\xhh’:1~2位十六进制整数表示的1个字符
eg:‘\x56’
(3)字符串常量 :“ABCD” 双引号括起多个字符
一个字符占1个字节——‘A’:占1个字符
一个汉字占2个字节——“A”:占2个字符
字符串中要有'\0'
(可省略)作为字符串结束的标志
" ":为空字符串
2、字符变量
char——占1个字节
%c:输出字符原型
%d:输出字符的ASCLL码值
给字符型变量赋值只能赋1个字符
字符不能加减:
法1:要转为ASCLL码值
法2:字符+整型:字符向后移整型位
字符-字符:距离差(整数)
1、算术运算符
+、-、*、/、%(取余)
不四舍五入
小%大→小
2、运算符的优先级与结合性
3、强制类型转换
1、赋值运算符
形式:变量名=表达式 赋值符号左边只能是变量
优先级:仅高于逗号表达式
结合性:自右向左
说明:先计算表达式的值,然后将其赋值给变量
2、复合赋值运算符
+=、-=、*=、/=、%=
优先级:仅高于逗号运算符
结合性:自右向左
1、自加自减运算符
++变量、--变量、变量++、变量--
自加自减的运算对象必须是变量(单独变量)
(变量立即变化,前值用新值)
(后值及原值,用原值再变化)
拆分原则
:自加自减在前,先加减12、逗号运算符
表达式1,表达式2,.......,表达式n
说明:自左向右顺序求值
,将表达式n的值
作为整个逗号表达式的值
优先级:最低
结合性:自左向右
赋值语句构成:在赋值表达式的后面加上分号
就构成了赋值语句。
eg:a=2;b=a+3; ++i;
赋值符号的左边只能是变量,不能是表达式
。
1、字符原样输出
int a = 123;
float f = 123.45;
char c = 'a';
printf("a=%d,f=%f,c=%c\n",a,f,c);
printf("<%d,%f,%d>\n",a,f,c);
输出结果:a=123,f=123.450000,a
<123,123.450000,97>
2、指定宽度输出
指定>实际:左补空格
指定<实际:原样输出
in a = 234;
printf("a=%4d\n",a);// %4d:4位十进制整数(位数不够,左补空格)
printf("a=%2d\n",a);// %2d:2位十进制整数
输出结果:a= 234
a=234
3、
%m.nf | m:代表数据总长 |
---|---|
. | n:代表小数位数四舍五入 |
. | 小数点占一位 |
指定>n:四舍五入
指定
float f = 24.35678;
printf("f=%8.3f\n",f);
printf("f=%11.6f\n",f);
输出结果:f= 24.357
f= 24.356780
4、
int a = 1,b = 2;
printf("%d\n",(a,b));// 一个输出项,(a,b)逗号运算=b
printf("%d\n",a,b);//只一个输出格式,输出a
输出结果:2
1
5、
int定义的整型范围:-32768~32767(int数据范围)
32767+1=-32768
int a = 32767,b = 1;//假定int型占2个字节
printf("%d\n",a+b);
输出结果:-32768
无符号65535==有符号-1
6、
无符号数据范围:0~65535
%u:无符号十进制整数
unsigned int a = 65535,b = 1;
printf("%u\n",a+b);
输出结果:0
1、&:取地址运算符
整型数据输入格式,如果没有其他符号分隔,用空格或回车分隔
int x,y;
scanf("%d%d",&x,&y);
printf("%d,%d\n",x,y);
现要给x赋值2,y赋值5
输入写法:2 5
输出结果:2,5
2、字符原样输入
int a,b;
scanf("a的值:%d,b的值:%d",&a,&b);
printf("%d,%d\n",a,b);
现要给a赋值1,b赋值2,
则输入写法:a的值:1,b的值:2
输出结果:1,2
3、指定输入数据的宽度
输入宽度不得少于指定宽度
int a,b,c;
scanf("%1d%2d%3d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
现从键盘输入:9876543210
输出结果:9,87,654
4、实型数据输入
输入数据时,不能指定小数位数
错误示范:
float f;
scanf("%4.2f",&f);×
5、字符的输入与输出
(1)输入写法:%c前不能随便加空格
char c1,c2;
scanf("%c%c",&c1,&c2);
printf("%c,%c\n",c1,c2);
若给c1赋值字符A,c2赋值字符B
正确的输入写法为:AB
输出为:A,B
(2)字符输入函数:getchar
(3)字符输出函数:putchar
getchar,putchar只针对字符的输入和输出
char ch;
ch = getchar();
putchar(ch);
1、复合语句:{ a=2;b=3;c=a+b; }
2、空语句: ;
1、空瓶子交换原理
输入两个整数a和b,将其值交换后输出
设:输入1 2
int a,b,t;
scanf("%d%d",&a,&b);
t=a;a=b;b=t;
printf("%d,%d\n",a,b);
2、和差差
输入两个整数a和b,将其值交换后输出
设:输入1 2
int a,b;
scanf("%d%d",&a,&b);
a=a+b;b=a-b;a=a-b;
printf("%d,%d\n",a,b);
C语言中的逻辑值:C语言将非0值
当作真(1),0值
当作假(0)
1、关系运算符
>、>=、<、<=
> ==(等于),!=(不等于)
优先级:前四者高于后两者
结合性:自左往右比较
2、关系表达式
成立———1
不成立——0
1、逻辑运算符
!(非),&&(与),||(或)
优先级:!→ && → ||
结合性:!:自右向左
------&&、||:自左向右
&&运算优先级高,先结合为一个式子(不先算);后从左向右计算
表达式 等价于 表达式!=0
!表达式 等价于 表达式==0
2、逻辑表达式
&&:且(条件同时满足)
有0出0;全1才1
0&&0=0、 0&&1=0、 1&&0=0、 1&&1=1
||:或(只满足一个即可)
有1出1;全0才0
0||0=0、 0||1=1、 1||0=1、 1||1=1
!:取反
!0=1、 !1=0
3、短路运算
设int a = 1;b = 2;c = 3;
执行表达式(a>b)&&(c=1)后c的值是3
设int a = 1;b = 2;m = 2;n = 2;
执行表达式(m=a<b)||++n后,n的值是2
if(条件)语句;
一个if条件只能控制一条语句
1.以下代码功能:a,b,c排序
main()
{
float a,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b) { t=a;a=b;b=t; }//复合语句
if(a<c) { t=a;a=c;c=t; }
if(b<c) { t=b;b=c;c=t; }
printf("%f",c);
}
输入:1.1,3.1,2.1
输出:1.100000
if(条件) 语句1;
else 语句2;
就近原则:
else总和上面的、离它最近的、未配对的if进行配对
1、if条件若为赋值语句,只有赋0值为假(赋字符为真)
int a=1;c=5;
if(c=a+=1) printf("来输出我\n");
else printf("不输出我\n");
输出结果:来输出我
2、无论条件真假,经过自加自减变量都会加1或减1
int x;
scanf("%d",&x);
if(x++>5) printf("%d\n",x);//条件执行后x自加1
else printf("%d\n",x--);
1.从键盘输入数字6,则输出结果为7
2.从键盘输入数字4,则输出结果为5
条件?值1:值2
执行过程:左真右假
条件为真结果为值1
,条件为假结果为值2
优先级:仅高于赋值与逗号
结合性:自右向左
已知a=1,b=2,c=3,d=4,x=5,则语句x=(a>b?a:c<d?c:d);执行后x的值为3.
a>b:条件
a:值1
c<d?c:d为值2
先进入再向下
。整型常量,整型常量表达式,字符常量
。”其他“
分支,可有可无,位置任意。例1:
int x,a=0,b=0;
scanf("%d",&x);
switch(x) //()中可以为常量、变量、表达式,但不能为实型
{
case 0:a++; //case后的表达式:整型常量,常量表达式或字符常量(对应的ASCLL码值)
case 1:b++;
default:a++;b++; //default为其他
}
printf("%d,%d\n",a,b);
输入0 输出2,2
输入1 输出1,2
输入2 输出1,1
例2:i=0,无case0时,返回default并执行该语句及以下语句。
例2.1:
switch(i)
{
default:printf("%d",i);
case 1:printf("%d",i);
case 2:printf("%d",i);
}
输出结果:000112
例2.2:
#include
main()
{
int x=2;
switch (x<0)
{
case 1:printf("1");
default:printf("3");
case 2:printf("2");
}
}
输出为:32
例子2.3:输出为空
例子2.3
#include
main()
{
int x=2;
switch (x<0)
{
case 1:printf("1");
case 2:printf("2");
}
}
例子:2.4
#include
main()
{
int x=2;
switch (x>0)
{
case 1:printf("1");
case 0:printf("0");
default:printf("3");
}
}
输出:103
例子:2.5
#include
main()
{
int x=2;
switch (x>0)
{
case 1:printf("1");
default:printf("3");
case 0:printf("0");
}
}
输出:130
while(条件) 语句;
条件 就是 范围、为关系表达式时可判断真假
执行过程:先判断条件,当条件为真
时执行循环语句,直到条件为假循环结束。
1.输出在循环体内部,循环几次输出几次;
输出在循环体外部,只输出一个总值。
例1:
int n=1;
while(n<=3)
{
printf("%d\n",n);
n++;
}
输出结果:1
2
3
x%10:取末位
x/10:消末位
例2:
int x=1234,s=0;
while(x!=0)
{
s+=x%10; //循环累加
x/=10;
}
printf("%d\n",s);
输出结果:10
do 语句;
while(条件);
为一个语句
while后分号不可省略,代表循环语句结束。
执行过程:先执行语句,再判断条件,当条件为真时继续执行循环语句,直到条件为假循环结束。
循环次数:条件成立次数
循体(循环语句 )执行次数:循环次数+1
int i=1,s=0;
do
{ s=s+i;i++; } //s=s+i循环累加
while(i<=3);
printf("%d",s);
输出结果:6
循环次数:2次
循体执行次数:3次
while与do-while语句的区别
1.do-while语句至少执行一次,while语句可能一次也不执行。
2.do-while语句结束的标志是while后面的分号。
1.求输入整数的个位数字之和
#include
main()
{
int i,sum=0;
scanf("%d",&i);
while(i!=0)
{
sum+=i%10;
i/=10;
}
printf("sum is %d\n",sum);
}
2、求输入整数的个位数字之积
#include
main()
{
int i,j=1;
scanf("%d",&i);
while(i!=0)
{
j*=i%10;
i/=10;
}
printf("j is %d\n",j);
}
for(初值;条件;增量) 语句;
┌————————————---┐
↓ |
↓ T |
初值——→条件---——→语句——→增量
|F
↓
结束
1.i=1,for( ;条件;增量) 语句;----------------(省略式1,执行式2)
2.for(i=1; ;i++) s=0+i;--------------------(省略式2,默认条件为真[1])-----死循环程序
3.for(i=1;i<20; ) { s=s+i;i++; }-----------(省略式3,回执式2)-------------i++为增量
4.for( ; ; ) 语句;--------------------------(3式都可省)-------------------分号不能省略且只有2个
5.for(x=1,y=1;y&&(x>4);x–) ;--------------(空循环体)
break;
跳出终止
当前循环例子:
main()
{
int i;
for(i=0;i<3;i++)
switch(i)
{
case 1:printf("%d",i);
case 2:printf("%d",i);break; //跳出switch语句
case 3:printf("%d",i);
}
}
输出:0112
continue;
结束本次
循环继续continue:1.while循环----------返回条件
2.do-while循环-------返回条件
3.for循环------------返回式3增量
#include
main()
{
int y;
for(y=12;y>0;y--)
if(y%3==0)
{
printf("%d",--y);
continue;
printf("%d",y--);
}
printf("\n");
}
输出:11852
例子;
int i,j,s;
for(i=2;i<4;i++)
for(s=0,j=3;j<5;j++) //内层循环当作外层循环语句
s+=i*j;
printf("%d\n",s);
更相减损法 求 最大公约数
例子:
int a=18,b=11;
while(a!=b)
{
while(a>b) a-=b; //为假时返回到条件
while(b>a) b-=a;
}
printf("%d,%d\n",a,b);
输出:1,1
例子:
下面程序完成判断某一个数 m 是否为素数,
如果是则输出”m是素数!“,
否则就输出”m不是素数!“,请选择填空:
main()
{
int i,m;
scanf("m=%d",&m);
for(i=2;i<m;i++)
{
if(m%i==0)
{
printf("%d不是素数!\n",m);break;
}
else continue;
}
if(i==m) printf("%d是素数!\n",m);
}