c语言基本常识有哪些_C语言程序架构 IT知识
电脑知识 由优尔供稿C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。下面一起来看看9252儿童网小编为大家整理的c语言基本常识,欢迎阅读,仅供参考。
C语言基础知识
一:主要内容
1.C数据类型
2.简单的算术运算和表达式
3.键盘输入和屏幕输出
4.选择控制结构
总结风格:分条罗列,主要是知识点,有例题不多
5.循环控制结构
一、C数据类型
1.C语言处理两种数据:常量和变量
2.常量:整形常量、实型常量、字符常量、字符串常量、枚举常量
3.整形常量:正整数、负整数、零 eg: 10,-30,0
4.实型常量:实数、小数、浮点数 eg: 3.14,-0.56,18.0
5.字符常量:字符型常量、用单引号括起来的任意字符 eg: x X ? , 9
6.字符串常量:用双引号括起来的一个或多个字符 eg: "x" "Hello" "Y78"
7.在C程序中,整型常量可以用十进制、八进制、十六进制形式表示,但编译器都会自动将其转换成二进制存储
8.整型常量的类型:长整型、短整型、有符号、无符号。
9.不同进制的整型常量的表示形式:
1)十进制:0~9数字组合,可带正负号 eg: 256,-128,0,+7
2)八进制:0开头,后面跟0~7数字组合 eg: 021,-017
3)十六进制:0x(0X)开头,后跟0~9,a~f(A~F)数字组合 eg:0x12,-0x1F
10.不同类型的整形常量的表示形式:
1) 有符号整型常量:默认int型定义为有符号整数,无需signed eg:10,-30,0
2) 无符号整形常量:常量值后跟u或U,只能表示>=0的数 eg:30u,256U
3) 长整型常量:常量值后跟l或L eg:-256l,1024L
4) 无符号长整型常量:常量值后跟LU、Lu 、lU 、lu eg:30lu
11.C程序中,实型常量两种表示形式:小数、指数
12.不同形式的实型常量的表示形式:
1) 十进制表示形式:数字和小数点组成,必须要有小数点,整数部分可省略 eg:0.123, -12.35, .98
2) 指数形式:e或E代表以10为底的指数, e左边是数值部分(有效数字,可以是整数、小数,不能省略),e右边是指数部分(必须是整数形式) eg:3.45e-6
13.实型常量有单精度和双精度之分,无有符号和无符号之分
14.不同类型的实型常量表示形式:
1)单精度实型常量:常量值后跟F或f eg:1.25F,1.25e-2f
2)双精度实型常量(double):实型常量默认按双精度处理 eg:0.123,-12.35, .98
3)长双精度实型常量(long double):常量值后跟L或l eg:1.25L
15.变量:在程序执行过程中可以改变的量
16.变量在必须先定义后使用,定义时需要声明变量的类型和变量名,一般形式:类型关键字 变量名;
17.关键字是C语言预先规定具有特殊意义的单词,类型关键字用于声明变量的类型
18.标准C语言编写的程序都是以main()作为开头,指定了C程序执行的起点,在C程序中只能出现一次,称为主函数
19.C程序总是从main函数开始执行,与他在程序中的位置无关,main函数主体部分称为语句,用{}括起来,一般C语句以;结束
20.变量的类型决定了编译器为其分配内存单元的字节数、数据在内存单元中的存放形式、该类型变量合法的取值范围以及该类型变量可参与的运算种类
21.变量名是用户定义的标识符,用于标识内存中具体的存储单元,存放的数据称为变量的值
22.新数据存放于存储单元时,旧数据将会被修改,反应变量的值是可以改变的
23.变量名的命名规则:
1)标识符只能由英文字母、数字、下划线组成
2)标识符必须以字母或下划线开头
3)不允许使用C关键字为标识符命名
4)标识符可以包含任意多个字符,但一般会有最大长度限制,预编译器有关,一般不会超过,最好不超过8个字符
注意:标识符区分大小写
eg:x y3 _imax ELSE X A_to_B (合法)
eg:7x int #No bad one re-input(不合法)
24.标准C规定所有变量必须在第一条可执行语句之前定义
25.在同一条语句中可以同时定义多个相同类型变量,多个变量之间用逗号分隔,没有顺序要求
26.在使用标准输入/输出函数时,必须在程序开头加上编译预处理命令
27.中stdio为头文件,std是standard,i为input,o为output,h为head
28.编译预处理命令#include的作用:将在输入/输出函数的头文件stdio.h包含到用户源文件中
29.%d按十进制整数个格式输出,%f按十进制小数格式输出,一般输出6位小数,%c输出一个字符, 换行,双引号内字符原样输出
30.不同类型的数据在内存中占用不同大小的存储单元,他们所能表示的数据的取值范围各不相同,不同类型的数据表示形式及其可以参与的运算种类也不同
31.定义整型变量时,只要不指定为无符号型,其隐含类型为有符号型,signed通常省略不写
32.C程序中每个变量的值都是按字节编址,都被存储在内存中特定的存储单元中,这个存储空间实际是一个线性地址表,即每个字节的存储空间对应一个唯一的地址
33.1个字节等于8个二进制位,即8个位为一个字节,一个字节可以表示的整数最小为0,最大255,即8个位可以表示0-255之间的数,一个二进制位的值只能是0或1
34.同种类型在不同的平台所占字节数不同,要计算数据类型所占内存空间的字节数需要用sizeof()运算符
35.sizeof是C语言关键字,不是函数名,sizeof(变量名)计算一个变量所占内存的字节数
36.计算不同类型运算符的表达式时,要考虑运算符的优先级和结合性
37.正数的反码、补码与原码都相同,负数的补码等于反码加1
38.在计算机内存中负数都是用补码来表示
39.对于实数,无论小数海曙指数形式,在计算机内存中都采用浮点形式来存储
40.浮点数分为阶码、尾数两部分,实数N=S*pow(r,j),S为尾数(无论正负,规定用存小数),j为阶码(无论正负,必须是整数),r是基数 eg:10.0111=0.100111*pow(2,10)
41.阶码所占位数决定实数的取值范围,尾数所占位数决定实数的精度,尾数的符号决定实数的正负,阶码和尾数的字节大小与编译器有关
42.float型变量能接收实型常量的7位有效数字,double型变量能接收16位
43.运算符的优先级:单目运算<算术运算<关系运算<逻辑运算<条件运算<赋值运算<逗号运算
44.素数:又称质数,指在大于1的自然数中,除1和本身不能被其他自然数整除的数
45.合数:指在自然数中除1和本身外还能被其他自然数整除的数
46.因子:所有能整除这个数的数,不包括自身,但包括1
47.闰年:能被4整除但不能被100整除,或能被400整除
二、 简单的算术运算和表达式
1.条件运算符是C语言提供的唯一一个三元运算符,C语言中没有幂运算符
2.只有计算相反数是一元运算符,其余运算符都是二元运算符
3.一元运算符也叫单目运算符,二元运算符也叫双目运算符,三元运算符也叫三目运算符
4.整数除法的结果是整数,浮点数除法的结果是浮点数
5.求余运算限定参与运算的两个操作数必须为整型,余数的符号与被除数的符号相同,不能对两个实型数进行求余运算
6.所有的算术运算符中只有一元的去相反数运算符为右结合,其余的结合性都为左结合
7.同一优先级的运算符进行混合运算时,从左向右依次进行
8.运算符的优先级:单目运算>算术运算>关系运算>逻辑运算>条件运算>赋值运算>逗号运算
9.计算并输出一个三位整数的个位、十位、百位数字之和
#include
void main()
{
int x=321;
int a,b,c,sum;
a=x%10;//a=1
b=(x/10)%10;//b=2
c=x/100;//c=3
sum=a+b+c;
printf("a=%d,b=%d,c=%d sum=%d ",a,b,c,sum);
}
10.涉及算术运算的复合赋值运算符有5个:+=,-=,*=,/=,%=
11.增1运算符也称自增运算符,减1运算符也称自减运算符,都是一元运算符,只有一个操作数必须是变量不能是常量或表达式
12.自增自减运算符作为前缀时,先执行加1或减1然后使用;自增自减运算符作为后缀时,先使用再执行加1或减1;
13.考虑优先级与结合性的实例
m=-n++《=》m=-(n++)《=》m=-n,n=n+1;
//正面:-和++都是一元运算符,优先级相同,此时要考虑结合性,结合性都是右结合的,所以先算++后算-
//反面:如果等价m=(-n)++就不合法了,因为表达式不能进行自增操作
14.scanf函数和printf函数都是C的标准输入/输出函数,&为取地址运算符
15.宏常量与宏替换:
1) 在程序中直接使用的常数称为幻数,将幻数定义为宏常量或const常量是为了提高程序的可读性和可维护性
2) 宏常量也称符号常量,没有数据类型,编译器不对其进行类型检查,只进行字符串替换
3) 宏定义一般形式:#define 标识符 字符串。标识符被称为宏名,宏名与字符串之间可有多个空白符,不加等号,结尾不加分号
4) 宏常量是由宏定义编译预处理命令来定义,宏名替换成字符串的过程称为宏替换,宏替换不做任何语法检查
5) 当宏定义是一个表达式时,调用时,是一个数就可以直接带入,而是表达式也要看成是一个数代进宏定义表达式中,
而看成一个数这就要求把调用的数加上圆括号,为了减少不必要的错误,最好都加上圆括号
6) 宏替换的过程是将宏名原样替换成字符串,而不是直接计算出值,所以要用调用后的结果参与其他运算就需要把调用的结果加上圆括号
7) 例题:
#include
#define N 2 //N=2
#define M N+1 //M=2+1
#define NUM 2*M+1 //NUM=2*2+1+1=6
void main()
{
int i;
for(i=1;i<=NUM;i++);
printf("%d ",i); //执行完空循环,i=7
i--; // i=6
printf("%d ",i);
}
8) 例题:
#include
#define f(x) x*x
void main()
{
int b;
b=f(4+4); //b=4+4*4+4=24,解释见5)
printf("b=%d ",b);
}
9) 例题:
#include
#define f(x) x*x
void main()
{
int b;
b=f(4+4)/(2+2); //b=4+4*4+4/(2+2)=21解释见6)
printf("b=%d ",b);
}
10) 例题:
#include
#define f(x) x*x
void main()
{
int b;
b=f((4+4)); //b=(4+4)*(4+4)=64
printf("b=%d ",b);
}
11) 例题:
#include
#define f(x) (x*x)
void main()
{
int b;
b=f((4+4))/(2+2); //b=((4+4)*(4+4))/(2+2)=16
printf("b=%d ",b);
}
16.const常量
1) const常量只能在定义时赋初值,因为编译器将其放在只读存储区,不允许在程序中修改
2) const常量的定义一般形式:const 类型名 标识符=字符串;//将标识符声明为具有该数据类型的const常量
3) const是一种类型修饰符,const常量具有数据类型,编译器要对其进行类型检查
17.表达式中的自动类型转换:
1) 表达式中,操作数类型相同,运算的结果类型与操作数类型相同
2) 表达式中,操作数类型不相同,C编译器自动将所有操作数进行类型提升,转换成同一类型,所占字节最大,再计算
18.赋值中的自动类型转换:
1) 赋值运算符左侧变量与右侧表达式类型不同时,发生自动类型转换:右侧表达式的值转换成左侧变量的类型
19.强制类型转换:
1) 强制类型转换运算符是一元运算符
2) 强制类型转换也称强转,是将表达式的值转换为任意类型,并不改变变量本身的数据类型
3) 强转一般形式:(类型)表达式
4) 演示强制类型转换运算符的使用
#include
void main()
{
int m=5;
printf("m/2=%d ",m/2);//m=2
printf("(float)(m/2)=%f ",(float)(m/2));//m=2.000000
printf("(float)m/2=%f ",(float)m/2);//m=2.500000
printf("m=%d ",m);//m=5,只是将m强转为实型数据,并不改变m的数据类型 }
20.常用的标准数学函数:
1) 使用C标准数学函数,要在程序开头加上编译预处理命令:#include
2) 例:已知三角形三边长为a,b,c,计算三角形的面积
#include
#include
void main()
{
float a,b,c,s,area;
printf("Input a,b,c:");
scanf("%f,%f,%f",&a,&b,&c);
s=(a+b+c)/2;
area=(float)sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%f ",area);
}
21.赋值运算符的左侧不能出现表达式,变量与变量之间可以赋值
例1:若有定义:int a,b,c;下列表达式中哪一个是合法的C语言赋值表达式(C、D)
A)a=7+b=c=7 B)a=b++=c=7 C)a=(b=7,c=12) D)a=3,b=a+5,c=b+2
//A.7+b表达式不能做左值 B.b++表达式不能做左值 C.逗号表达式a=12 D.依次赋值
例2:下面不正确的赋值语句是(B)
A)a=++a B)a=b++=10 C)a+=b D)a=1>a
//D.算术运算符优先级高于赋值运算符,先算1>a再将其结果赋给a
例3:若有下列定义:int a=3,b=2,c=1;以下选项错误的赋值表达式是(A)
A)a=(b=4)=3 B)a=b=c+1 C)a=(b=4)+c D)a=1+(b=c=4)
//A.先计算圆括号里的值等于4,然后按照赋值表达式的顺序从右向左计算,将3赋值给4这是不对的,即赋值号左侧只能是变量,不能出现表达式b=4
三、 键盘输入和屏幕输出
1.字符常量:
把字符放在一对单引号内,适用于多数可打印字符
2.转义字符:
以反斜线()开头,也是放在一对单引号内,适用于控制字符(如回车符,换行符)
3.常用的转义字符:
1) — 换行 8) a — 响铃报警提示音
2) — 回车(不换行) 9) " — 一个双引号
3) — 空字符 10) — 一个单引号
4) — 水平制表 11) — 一个反斜线
5) v — 垂直制表 12) ? — 问号
6) — 退格 13) ddd —1到3位八进制ASCII码值所代表的字符
7) f — 走纸换页 14) xhh —1到2位十六进制ASCII码值所代表的字符
4. ,是将光标移到下一行起始位置, 是将光标移到当前行的起始位置
5. ,是水平制表符,相当于按下Tab键,每次按下Tab键并不是从当前光标位置向后移动一个Tab宽度,而是移到下一个制表位,实际移动的宽度视当前光标位置距相邻的下一个制表位的距离而定
6.制表位,屏幕上的一行被分为若干个域,相邻域之间的交接点称为制表位,每个域的宽度就是一个Tab宽度,多数习惯上为4
7.当转义序列出现在字符串中时,是按单个字符计数的
8.一个整形数在内存中是以二进制形式存储的,而一个字符在内存中也是以其对应的ASCII码的二进制形式存储的,但char型数据在内存中只占一个字节,而int型数据在16位系统中占2个字节,32位系统占4个字节。
9.在ASCII码取值范围内,char型数据可以和int型数据进行混合运算,char型数据也能以int型输出,直接输出其对应的ASCII码的十进制值
10.字符的输入/输出:
1) get)和put)是C标准函数库中专门用于字符输入/输出的函数,功能是只能输入/输出一个字符
2) 例:从键盘输入一个大写英文字母,将其转换为小写字母显示在屏幕上
#include
void main()
{
char ch;
ch=get);//键盘输入一个字符,再按回车表示输入结束,字符存入变量ch,注意:get)没有参数,直接返回读入的字符
ch=ch+32;
putch);//第二次按回车,将显示转换后的结果
put );//注意:put)内一定要有参数,参数就是待输出的字符,可以是可打印字符,也可是转义字符
}
11.数据的格式化屏幕输出:
1) 函数printf()的一般格式:printf(格式控制字符串);或者printf(格式控制字符串,输出值参数表);
2) 格式控制字符串包括:格式转换说明符,需要原样输出的普通字符
3) 函数printf()的格式转换说明符:
%d — 输出带符号十进制整数,整数符号省略
%u — 输出无符号十进制整数
%o — 输出无符号八进制整数,不输出前导符0
%x — 输出无符号十六进制整数(小写),不输出前导符0x
%X — 输出无符号十六进制整数(大写),不输出前导符0x
%c — 输出一个字符
%s — 输出字符串
%f — 以十进制小数形式输出实数,包含单,双精度,隐含6位小数,但并非全是有效数字,单精度有效7位,双精度16位
%e — 以指数形式输出实数(小写e表示指数部分),小数点前有且仅有一位非0数字
%E — 以指数形式输出实数(大写E表示指数部分)
%g — 自动选取f或e格式中宽度较小的一种使用,不输出无意义的0
%% — 输出%
4) 输出值参数表:需要输出的数据项的列表,可以是变量或表达式,逗号隔开,类型与格式转换说明符相匹配
5) 每个格式转换说明符与输出值参数表中的输出值参数一一对应,没有输出值参数,格式控制字符串就不需要格式转换说明符
6) 例:从键盘输入一个大写英文字母,将其转换为小写字母和其十进制ASCII码值显示在屏幕上
#include
void main()
{
char ch;
printf("Please enter a key:");
ch=get);
ch=ch+32;
printf("%c,%d ",ch,ch);//printf("%c",ch)<<=>>putch),printf(" ")<<=>>put ) }
7) 函数printf()中的格式修饰符:在%和格式符中间插入格式修饰符,用于输出格式的微调,如:指定输出域宽、精度、左对齐等
英文字母l — 修饰格式符d,o,x,u时,用于输出long型数据
英文字母L — 修饰格式符f,e,g时,用于输出long double型数据
英文字母h — 修饰格式符d,o,x时,用于输出short型数据
输出域宽m — m为整数,输出时占m列,若m>0,当数据宽度小于m时,域内右靠齐,左补空格,当数据宽度大于m时,修饰符失效,按实际宽度输出,若m有前导符0,左边多余位补0;若m<0,输出数据在域内左靠齐
显示精度 .n — n为大于等于0的整数,精度修饰符位于最小域宽修饰符之后,由圆点和整数构成,对于浮点数,用于指定输出的浮点数小数位数;对于字符串,用于指定从字符串左侧开始截取的子串字符个数
8) 使用const常量定义pi,编程从键盘输入圆的周长和面积,使其输出数据保留两位小数
#include
void main()
{
const double pi=3.14159;
double r,circum,area;
printf("Please enter r:");
scanf("%lf",&r);
circum=2*pi*r;
area=pi*r*r;
printf("输出没有宽度和精度的值:");
printf("circum=%f,area=%f ",circum,area);
printf("输出没有宽度和精度的值:");
printf("circum=%7.2f,area=%7.2f ",circum,area);//域宽为7,占7个字符宽度,小数点也算一个字符,精度为2,小数点后保留2位
}
12.数据的格式化键盘输入:
1) 函数scanf()的一般格式:scanf(格式控制字符串,参数地址表);
2) 格式控制字符串:包括格式转换说明符,分隔符
3) 格式转换说明符以%开始,以格式字符结束,用于指定各参数的输入格式
4) 函数scanf()的格式转换说明符:
%d — 输入十进制整数
%o — 输入八进制整数
%x — 输入十六进制整数
%c — 输入一个字符,空白字符(包括空格、回车、制表符)也作为有效字符输入 %s — 输入字符串,遇到第一个空白字符(包括空格、回车、制表符)时结束 %f或%e — 输入实数,以小数或指数形式输入均可
%% — 输入一个%
5) 参数地址表:由若干变量的地址组成的列表,用逗号分隔
6) 函数scanf()中的格式修饰符:在%和格式符中间插入格式修饰符
英文字母l — 加在格式符d,o,x,u之前,用于输入long型数据;加在f,e之前,用于输入double型数据
英文字母L — 加在格式符f,e之前,用于输入long double型数据
英文字母h — 加在格式符d,o,x时,用于输入short型数据
输出域宽m — m为正整数,指定输入数据的宽度,系统自动按此宽度截取所需数据
显示精度 .n — n为0或正整数,scanf()没有精度格式修饰符,输入时不能规定精度 忽略输入修饰符* — 表示对应的输入项在读入后不赋给相应的变量
7) 函数scanf()输入数值型数据时,被认为输入结束的几种情况:遇空格符、回车符、制表符;达到输出域宽;遇非法字符输入
8) 如果函数scanf()的格式控制字符串中存在除格式转换说明符以外的其他字符,必须将这些字符原样输入
#include
void main()
{
int a,b;
scanf("%d %d",&a,&b); //以空格作为分隔符,等价于scanf("%d%d",&a,&b),等价于scanf("%d %d",&a,&b),
printf("a=%d,b=%d ",a,b);//实际输入时,空格、回车符、制表符都可作为分隔符,即输入:12空格34 12回车34 12制表符34均可,
}
#include
void main()
{
int a,b;
scanf("%d,%d",&a,&b);//输入时必须以逗号作为分隔符,即只能输入:12,34
printf("a=%d,b=%d ",a,b);
}
#include
void main()
{
int a,b;
scanf("a=%d,b=%d",&a,&b);//输入时必须将"a="和"b="原样输入,即只能输入:a=12,b=34 printf("a=%d,b=%d ",a,b);
C语言程序架构
1.多模块初始化注册架构
一个大型软件由多个模块构成,在初始化过程中,依次调用这些模块的初始化函数,这些初始化函数将这些模块内部提供的可供调用接口集中注册到一个大的数据结构中。然后main函数才开始处理接收到的参数,根据收到参数的不同,去调用大数据结构中不同的接口函数。
适用场景:适用于构造交互式程序,初始化时,所有模块都注册好,开始接受用户输入时,根据输入参数调用不同的函数接口。
2.查表架构
1). 在实现read,write,trim命令按照一定比率下发到设备的程序中,通过构造一个长度为100的数组,其中25个置为0代表read的比例,25个置为1代表write的比例,50个置为2代表trim的比例,通过生成大量的0~99的随机数,达到read,write,trim命令为25:25:50的比例。
2).一个下发队列,可以接受read,write,erase命令,而该队列的规则是最多同时处理4个read,2个write和1个erase,在想知道该下发队列还能接收什么命令时,通过查表实现,例如,下发队列中当前有1个write命令,则查表可以,它还可以接收1个write或2个read,不能接收erase。
适用场景:控制逻辑比较复杂的情况,适宜适用查表的方法来避免复杂的逻辑,以空间换时间。
3.交叉遍历架构
见前文:从m个不定长数组中 各取一个元素的组合生成算法
适用场景:适合交叉遍历测试程序的编写。
C语言基础循环结构
1.1 for循环结构
1.for循环语句的一般表达式是:
for(表达式1;表达式2;表达式3) 语句
2.C语言语法规定:循环体语句只能包含一条语句,若需多条语句,应使用复合语句。
1.2 while和do while循环结构
1.while语句用来实现″当型″循环结构,它的.一般形式如下:
while(表达式)语句
当表达式为非0值时执行while语句中内嵌的语句;当表达式的值为0时,直接跳过while语句后面的语句,执行下一条语句。
2.while语句执行的特点是:先判断表达式,后执行语句。
3.do while用来实现″直到型″循环结构,它的一般形式为:
do语句
while(表达式);
这个语句执行时,先执行一次指定的内嵌的语句,然后判别表达式,当表达式的值为非0时,返回重新执行该语句,如此反复,直到表达式的值为等于0为止,此时循环结束。
4.do while语句执行的特点是:先执行语句,后判断表达式。
1.3 continue语句和break语句
1.break语句有两个用途:①在switch语句中用来使流程跳出switch结构,继续执行switch语句后面的语句;②用在循环体内,迫使所在循环立即终止,即跳出所在循环体,继续执行循环体后面的第一条语句。
2.continue语句结束本次循环,即跳过循环体中尚未执行的语句。在while和do while语句中,continue语句将使控制直接转向条件测试部分,从而决定是否继续转向循环。在for循环中,遇到continue语句后,首先计算for语句表达式3的值,然后再执行条件测试(表达式2),最后根据测试结果来决定是否继续转向for循环。
1.4 循环的嵌套
1.一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。
2.三种循环(while循环、do while循环和for循环)可以互相嵌套。