一、常量与变量
(一)、概念
常量:不可能发生变化的数据称为常量,C语言中的常量并非仅限于数值型的“常数”,还包括字符,字符串,符号常量和常变量等。
变量:变量是内存中的一段存储区域*;**
程序之所以需要变量,是因为在程序运行过程中有些数据需要记住,变量就是用来记住这些数据的;
变量的存储数据是不固定的,可以改变
CPU在存储数据时一般情况下会采用小端模式,即先存低字节,再存高字节
(二)、变量的类型
类型 | 表示 | 存储方式 | 存储大小 |
---|
字符型 | char | ASCII码 | 1字节 | 短整型 | short | 补码 | 2 字节 | 整型 | int | 补码 | 2 或 4 字节 | 长整型 | long | 补码 | 4字节 | 无符号短整型 | unsigned short | 补码 | 2 字节 | 无符号整型 | unsigned int | 补码 | 1字节 | 无符号长整型 | unsigned long | 补码 | 4 字节 | 浮点型 | float | IEEE754 | 4 字节 | 双精度浮点型 | double | IEEE754 | 8 字节 |
变量的不同类型表示不同的数据,变量的短长,单双精度是为了合理分配内存空间,提高运行效率
变量类型输出
#include<stdio.h>
int main()
{
int a; //定义整型变量 a
char b; //定义字符型变量 b
float c; //定义浮点型变量 c
double d; //定义双精度浮点型变量 d
a=2001; //为变量赋值
b="jianghu";
c=10.05;
d=122.3536272828;
printf("江湖%d\n",a); //输出
printf("江湖:%d——江湖2001!\n",b);
printf("生日_date:%2f\n",c);
printf("小数%13.10f\n",d); //浮点型用“%f”表示占位符
return 0;
}
C语言中还有一类特殊的变量,这种变量用来存储某种实体的地址,这里所说的实体包括变量,数组和函数。 存储地址的变量称为指针变量
指针变量在内存中所分配的字节数与int型变量相同
C语言中,并没有给变量规定大小,但可以用运算符sizeof()求得某种类型或某项数据在内存中占用的字节数
使用时要在括号中写上类型名,变量名或表达式;
char a;
float b;
printf("%d,%d\n",sizeof(char),sizeof(a));
printf("%d,%d\n",sizeof(float),sizeof(b));
变量的存储大小(占字节数):
#include<stdio.h>
int main()
{
printf("%d\n",sizeof(char));
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(short));
printf("%d\n",sizeof(long));
printf("%d\n",sizeof(long long));
printf("%d\n",sizeof(float));
printf("%d\n",sizeof(double));
printf("%d\n",sizeof(unsigned int));
printf("%d\n",sizeof(unsigned short));
printf("%d\n",sizeof(unsigned long));
return 0;
}
输出结果:1,4,2,4,4,8,4,2,4
变量的分类:局部变量和全局变量
#include<stdio.h>
int a=2; //全局变量
int main()
{
int a=22; //局部变量
printf("%d\n",a);
return 0;
}
局部变量和全局变量名称相同是可以同时存在,但在执行时局部变量优先,所以建议局部变量和全局变量名称尽量不要相同 局部变量和全局变量的适用范围有差异,全局变量是由于全局范围均可执行,局部变量仅适用于局部*,局部变量的作用域是定义变量的函数体内,全局变量的作用域是整个项目工程。
(三)、变量
1.变量定义的格式
普通变量的定义格式:用类型名开头,加一个空格之后再写变量名(自己命名),定义多个变量,变量之间用逗号隔开。
int a; //定义整型变量 a
float x,y,z; //定义多个变量,变量之间用逗号隔开
指针变量的定义格式与普通变量定义格式相似,区别的是,指针变量名字前面要多写一个,*
char *p; //定义了一个指针变量p,用来存char型变量的地址
int *p1,*p2;
float x,y,*pi,*p2; //定义了两个普通变量和两个指针变量
变量必须先定义才能使用 定义变量的目的:一是给变量起一个名字,以便在程序中分辨它;二是把变量的类型告诉计算机,以便让计算机给变量分配存储空间,因为有了变量类型,计算机才知道该给变量分配多少字节,才能知道变量的值用什么方式存储。
2.变量的命名
不管是变量,还是数组,函数和结构体等,在C语言中每一样东西都有一个名字作为标识,即为:标识符
C语言对标识符有以下要求:
- 标识符只能由英文字母,数字和下划线组成,但不能以数字开头
- C语言是区分大小写的,即大小写被认为是两种不同的字符,例如:name和NAME是不一样的
- 不允许关键字作为标识符,C语言共有44个关键字不能作为标识符
- 标识符长度有限制,超过限制后面的字符不起作用
注:变量名不能与函数名同名
3.变量的属性
每个变量都有“值”和“地址”两个属性。
变量的值指的是变量在内存中所存的内容,变量的地址指的是变量在内存中所处的位置,其起始地址称为变量的地址
把内存的哪些字节分配给变量是无法预知的,但是变量的分配位置,系统可以感知,每当内存给一个变量分配了空间,系统都会把变量名和它的地址,类型等信息记下,以便可以随时找到它存取它,因此在变量获取空间后,其地址是可以被知道的,用取地址运算符&便可以获取变量的地址
输出变量的两个属性:
#include<stdio.h>
int main()
{
int a;
a=7;
printf("%d,%p\n",a,&a); //%p表示用十六进制数输出地址
return 0;
}
4.变量的赋值和赋初值
定义变量的目的就是为了存储数据,而赋值和赋初值就可以实现这一目的。
1)赋值:
再给变量分配空间的任务完成后,再给变量存放数据,成为赋值。
int a;
a=5; //向变量a中存放数据即为赋值
在C语言中“=”是赋值号,不是数学里的等于号,赋值就是存储:把赋值号右边的数据存储到左边的变量的内存空间中。C语言中,“==”才是等于号。 给指针变量赋值
int a,*p; //给变量a,p分配内存空间
p=&a; //把a的地址存到p中,即给p赋值
2)赋初值: 在给变量分配空间的时候就向其中存放数据,称为赋初值;
int a=3; //向内存申请空间直接赋值;
注意:变量赋初值相同时不能 int a=b=c=2; true: int a=2,b=2,c=2;
二、基本数据类型
(一)、整型数据
整型数据包括short,int,long,unsigned short,unsigned,unsigned long等所有整数
1.整型常量的表示
程序中用到的整型变量可以用三种进制表示:十进制,八进制,十六进制。
int a,b,c,d,e;
a=100; //十进制
b=0144; //用八进制表示整数必须以0开头
c=-0144;
d=0x64; //用十六进制表示整数,必须以0x或0X开头
e=-0x64;
2.整型数据的存储
所有整数在计算机中都是以补码的形式存放的,
3.整型数据的输出
常用的输出格式:
int a=2;
long b=2222;
short c=22;
printf("%d\n",a); //%d表示用十进制输出整数
printf("%o\n",a); //%o表示用八进制输出整数
printf("%x,%X\n",a,a); //%x或%X表示用十六进制数出整数
printf("%Ld,%lo,%lx\n",b,b,b); //加上l或L表示输出长整数
printf("%hd,%ho,%hx\n",c,c,c); //加上h表示输出短整数
- 无符号整数一般用%u格式输出,表示用十进制把一个数据当做无符号整数来输出。
unsigned int a=33563;
long b=2000;
printf("%u,%lu\n",a,b); // %u输出无符号整数
short a=-1;
unsigned short=64774;
printf("%hd,%hd\n",a,b); //%hd输入带符号短整数
printf("%hu,%hu\n",a,b); //%hu输入无符号短整数
(二)、实型数据
- 实型常量
1)实型常量:
带小数点的常量称为实型常量,实型常量的两种表示方式:小数形式,指数形式。
*指数形式:0.125=1.25X10^-1=1.25E-1
C语言规定:用指数形式表示实数时,E前面必须有数字,E后面必须是整数
2)实型常量的类型
实型常量有单精度(float)和双精度(double)两种类型,单精度表示的有效数位是小数点后7位,双精度表示的有效数位时小数点后15位,在常量后加上F或f表示单精度,在常量后加上L或l表示双精度。
- 实型数据的存储
单精度和双精度的实型数据,都是以浮点数的方式存储的,
float:
float型的任何数据,在存储之前都必须表示为
(+/-符号) x M x 2^n
其中,n是指数,M表示满足条件(1.0</=M<2.0)
如:30要先表示为+1.875x2^4
*实数的存储都是不精准的
float x=0.2;
if(x=0.2)
printf("相等\n");
else
print("不相等\n");
输出结果:不相等
- 实型数据的输出
单精度和双精度型数据都可以用%f或%e(%E)格式输出,%f格式使用小数输出,%e/%E格式是用指数形式输出
#include<stdio.h>
int main()
{
float x=12345678,y=0.00123;
double z=192837.3733837228;
printf("%f,%f,%f\n",x,y,z); //%f以小数输出
printf("%e,%e,%e\n",x,y,z); //%e以指数形式输出
return 0;
}
输出结果:12345678.000000,0.001230,192837.373384
1.234568e+007,1.230000e-003,1.928374e+005
(三)、字符型数据
数据不仅仅指数值,还包括字符,字符也是C语言程序中经常要处理的数据,C语言中可以处理的字符有英文字母,数字,标点,空格和其他的符号;
1.字符常量
单个的字符是字符常量,程序中要表示一个字符常量不能直接写字符名,会引起二义性,为了区分变量和字符常量,C语言规定:字符必须放在一堆对引号之中;
char c1='a',c2='b',c3='c';
C语言中单引号与普通引号不同,C单引号表示定界符,表示一个字符的前后界。 若在C语言中使用单引号,应该表示为’’’
*程序中的引号不分左右
C语言中,反斜线()的作用是把后面字符的本来含义转为另外的含义,如’\n’,不加斜杠表示字符n,加上斜杠表示换行符
C语言中以\开头的字符称为转义字符,
C语言常用的转义字符
转义字符 | 代表含义 | 输出字符的结果 |
---|
’ | 一个单引号 | 输出:’ | ‘’ | 一个双引号 | 输出:" | \ | 一条反斜杠 | 输出:\ | \b | 退格符(backspace) | 退回一格 | \n | 换行符 | 换行 | \r | 回车键 | | \t | 制表符(tab) | | \000 | | | \xhh | | |
2.字符数据的存储
C语言的字符是用ASCII码存储的,大小为一个字节
3.字符数据的大小
C语言认为字符也有大小,字符的的大小就是存储ASCII码值的大小。
且给字符数据既可以用作字符,也可以用作整数,给变量赋值是,即可以赋字符,也可以赋整数
char c1='A',c2=65,c3=' ',c4='1';
printf("%c,%c,%c,%c\n",c1,c2,c3,c4);
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);
printf("%d,%d,%d\n",c1+c2,c1+1,'A+1');
//输出结果: A,A, ,1
65,65,32,49
130,66,66
整数也可以当做字符型数据输出,只要数值不超过255,
printf("%c",65)
输出结果:A
4.字符数据的输出
输出字符型数据,可以用printf()函数,也可以使用putchar()函数;
(四)、字符串
程序中有时候需要一串字符,即字符串。
C语言规定:字符串必须使用一对双引号括起来,“a b c”,双引号中也可以没有字符"",表示一个空串。
C语言只有字符串常量,没有字符串类型的变量
1.字符串的存储
存储字符串是也是将ASCII码按照存储顺序存储,在后面要多加一个空字符(’\0’)表示结束
2.字符串的输出
输出字符串,printf()函数要使用%s格式,还可以使用puts()函数
printf("%s%s%s%s%s\n","abcd"," ","123","","xyz");
三、符号常量和常变量
符号常量:
为了使程序更加简洁,方便,增加可读性,需要在程序中定义符号变量
#define PI 3.1415926
PI为符号变量,3.1415926为符号变量的值,符号常量的命名通常使用大写字母 定义符号变量语句由#开头,所以属于预编译命令,称为宏定义
常变量:
const int n=60,m=50; //定义两个常变量并初始化
const float x=3.14;
常变量定义要用const开头,后面是定义变量,并赋初值(content恒定的) *常变量一旦初始化以后不允许发生改变,常变量只能赋初值,不能赋值,定义常变量以后可以使用但不能改变;
四、运算符和表达式
(一)算术运算符
算术运算符:+(正号),—(负号),*(乘),/(除),%(求余),+(加),—(减)
+(正号),—(负号)是单目运算符;
*(乘),/(除),%(求余),+(加),—(减)是双目运算符;
优先级:在C语言中,+正号,—负号优先级最高,+(正号),—(负号),*(乘),/(除),%(求余)优先级次之,+(加),—(减)优先级最低
结合性:单目运算符的结合性都是从右至左(右结合性),双目运算符的结合性是从左至右(左结合性);
*两个整数运算,最终结果还是整数
(二)赋值运算符
赋值运算符就是=,表示存储/赋予,即把等号右边的值给左边的变量
出现在赋值运算符左边的表达式称为**左值,**左值必须在内存中有大小合适的存储空间,且左值允许赋值(有宏定义则不予许赋值),变量是最常用的左值,但常变量不是左值,因为常变量不予许赋值,
复合赋值运算符:
运算符 | += | -= | *= | /= | %= |
---|
举例 | a+=2 | a-=b | a*=b+c | a/=b+c | a%=5 | 相当于 | a=a+2 | a=a-b | a=a*(b+c) | a=a/(b+c) | a=a%5 |
赋值运算符的结合性是从右自左,a=b=2相当于是a=(b=2)
**赋值表达式:**若一个表达式最后进行的是赋值运算,则该表达式是赋值表达式
**说明:**C语言中表达式最后执行的是什么运算操作就是什么表达式,
- C语言所有表达式都是有值的
- 赋值表达式的值等于赋值后左边变量的值
- 赋值表达式的值可以参与运算
- 赋值表达式的值可以付给另外一个变量
(三)自增减运算符
自增运算符:++
自减运算符:–
自增减运算符都属于单目运算符,都是右结合性,运算优先级与正负号相同。
自增运算符用于给便量增加一个1,自减运算符用于给变量减少一个1
自增运算符:
自增减运算符分为前++和后++,写在变量前的是前++,写在变量后的是后++
前++:
int i=1,m;
m=++i;
printf("%d,%d\n",m,i);
后++:
int i=1,m;
m=i++;
printf("%d,%d\n",m,i);
++i和i++的求解过程不同,++i和i++的值都是i,但是i的值不同 m=++i相当于
i=i+1 //先给i加1
m=i //表达式(++i)的值赋给m
注:++i是先计算再赋值 m=i++相当于
m=i //表达式(i++)的值赋给m
i=i+1 //给i加1
注:i++是先赋值再计算 表达式++i的值是加1之后的,表达式i++的值是加1之前的
自减运算符的用法与自加运算符类似
(四)逗号运算符
逗号运算符:
C语言中逗号也是运算符,逗号运算符是一个双目运算符,其结合性自左至右,优先级在C语言中是最低的,
逗号表达式:
逗号表达式的格式:表达式1,表达式2
逗号表达式的求值:
逗号表达式的值等于逗号后面表达式的值,“2,3”表达式的值是3,表达式“a=2,a3”的值是a3的值,即6,因为a=2所以先执行
多重逗号表达式:
(a=1,b=2),a+b
逗号表达式可以不断嵌套
表达式1,表达式2,表达式3…
(五)类型转换运算符
转换数据类型,
格式:(类型名)(表达式)
五、数据的类型转换
六、程序设计
- 从键盘输入一个大写字符,输出其小写;
- 从键盘输入两个整数,求他们的平方和;
- 分数的分子和分母都由键盘输入,输出分数的值;
- 从键盘输入两个整数,交换他们的值后输出他们;
1,程序设计实现:
要想使输入的大写字母输出为小写字母,则必须在程序中找到大小写字母的转换机制或转换函数,利用格式化输入,输出函数达到输入输出的效果;因为字符型变量的存储是利用ASCII码,所以在输入输出时我们也首先想到利用ASCII码来实现大小写的转换;例如大写A=65,小写a=97,a-A=32;
代码呈现:
#include<stdio.h>
int main()
{
char c1;
scanf("%c",&c1); //输入一个大写字母
c1=c1+32; //大写转换为小写
printf("%c\n",c1);
return 0;
}
输入结果:C
输出结果:c
程序改进:任意大小写输出转换
#include<stdio.h>
int main()
{
char c1;
printf("请输入一个字母:");
scanf("%c",&c1);
if(c1>='a'&&c1<='z') //if条件语句,判断输入字母的大小写
{
c1=c1-32;
printf("您输入的是小写字母,为您输出他的大写%c\n",c1);
}
else
{
c1=c1+32;
printf("您输入的是大写字母,为您输出他的小写%c\n",c1);
}
return 0;
}
输入结果:a
输出结果:A
输入结果:A
输出结果:a
2、程序设计实现:
输入两个整数来求他们的平方和,首先要定义两个整型变量,scanf输入,计算,printf输出结果
代码实现:
#include<stdio.h>
int main()
{
int a,b,he,A,B; //定义变量
scanf("%d%d",&a,&b);
A=a*a; //考虑到C语言的运算符的优先级,应该先算平方再求和
B=b*b;
he=A+B;
printf("%d\n",he);
}
3、程序设计 首先知道,分数的分子和分母就是除计算中的被除数和除数,计算环节等同于除法计算,需要注意的是结果的变量定义
代码实现:
4、程序设计
代码实现:
#include<stdio.h>
int main()
{
char a,b,c;
printf("请输入两个字符: \n");
scanf("%c%c",&a,&b);
c=a;
a=b;
b=c; //b=c=a
printf("交换字符:%c\t%c\n",a,b);
return 0;
}
另:system函数
system()调用外部命令函数:
#include<stdlib.h> //system函数的头文件/函数库
#include<stdio.h>
int main()
{
int value; //定义整型变量,用于返回整数值
value=system("dir/s"); //system用于调用外部系统命令或打开外部程序
printf("%d\n",value); //输出返回结果,如果是0表示执行成功,否则执行失败或中断执行
return 0;
}
|