栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言基础---02--变量常量与数据类型

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言基础---02--变量常量与数据类型

(注:本文中素材有部分源自网络,若有侵权联系删除)

目录

1 常量与变量

1.1常量

1.2 变量

2 标识符

 3 整型

4 无符号整型

5  字符类型

6 实型(浮点型)


1 常量与变量

什么是常量和变量?

1.1常量

正如其名,常量就是不会变化的量。

 比如 “hehe”就是一个字符串常量,‘a'就是一个字符常量,34就是一个整型常量。

还可以通过define来定义常量。

定义宏: 定义语法:#define 宏名 宏值

强调:没有分号结束标记。

#define pi 3.1415

在定义后pi将会成为一个常量,其值不会再改变。

还可以通过const来定义。

const关键字:被该关键字修饰的变量,表示为只读变量。但不推荐使用。通过指针仍然可以进行更改。

const  int a=10;

我们来进行一个简单的计算,计算圆的面积与周长。

include

#define pi 3.1415  //常量
int main() {
	int r = 3;//定义半径的值
	//定义小数会使用浮点数类型
	float s = pi * r * r;  //求取圆的面积
	float l = 2 * pi * r; //求取圆的周长
	printf("圆的周长为:%fn", l);
	printf("圆的面积为:%fn", s);   //%f在后面进行介绍

	return 0;
}

我们对%f进行一些小更改,使小数点后面位数变少 格式为  %.数字f

#include

#define pi 3.1415  //常量
int main() {
	int r = 3;//定义半径的值
	//定义小数会使用浮点数类型
	float s = pi * r * r;  //求取圆的面积
	float l = 2 * pi * r; //求取圆的周长
	printf("圆的周长为:%fn", l);
	printf("圆的面积为:%fn", s);   //%f在后面进行介绍
	printf("圆的周长为:%.2fn", l);
	printf("圆的面积为:%.2fn", s);

	return 0;
}

 

结果如上所示。 

1.2 变量

在上面写的c中,我们写入了一个r,这个r就是一个变量。

通过const仍然可以变成一个只读变量(目前当作常量来处理)

const int r=3;

变量,也就是可以变化的量。

定义语法(一般): 类型名 变量名 =变量值

变量三要素:

类型名  int

变量名 r

变量值  3

 int r=3后,计算机会为r分配一份空间。每一个变量都会有他唯一的地址。那么r就可以类比为房间号,通过r我们就可以进入计算机分配给r的这片空间。

空间的大小会以数据类型决定。int类型的大小为4个字节。

变量的定义: int a=20;

变量的声明:(1)int a  没有变量值的变量定义叫声明。

                      (2)extern int a  添加了extern关键字

以下内容非常重要

(1)变量定义会开辟内存空间,但声明不会。

int r

int r=3  计算机会为其分配内存空间

(2)当编译器编译程序时,在变量使用前,如果没有看到变量定义,编译器会自动寻找一个变量声明提升为定义。

也就是说,在变量使用前必须要进行定义。

(3)如果该声明前有extern关键字,无法提升。

来看一个实例进行理解

#include
int main() {
	int a = 40;  //定义变量
	
	a = 56; //在原本分配空间里用56将40进行了替换,名为变量赋值或者变量使用
	
	return 0;
}

 这样便没有问题,我们来进行一个更改

#include
int main() {

	a = 56;
	int a = 40;  //定义变量
	return 0;
}

程序会报错,显示未定义标识符’a'

#include
int main() {
	int a;
	a = 56;
	int a = 40;  //定义变量
	return 0;
}

我们定义了两次a,程序也会报错,显示为”重定义“

第一个int a已经被系统提升为了定义,在后面自然不可以再定义一回。

#include
int main() {
	 extern int a; //显示的做a的声明
	a = 56;
	
	return 0;
}

这样也会报错为‘无法解析的外部符号a’

因为使用extern后无法提升为定义。而使用a前又会自动定义,矛盾下将会无法进行。

建议:定义变量时,尽量不要重名。

2 标识符

标识符是变量与常量的统称。

命名规则:通常常量使用大写,变量使用小写,大小写严格区分。

                  只能使用字母,数字,下划线来命名标识符,且数字不可以排在第一位。

                 如  a345d     345-11

                 禁止使用关键字和系统函数作为标识符名称。main/system/sleep等

 3 整型

 int 类型 

int 名=值;

short类型

short 名=值;   short a=4;               

long类型

long 名=值;  long b=4;

long long类型

long long 名=值;   long long c =4;

本质上也就是长度不同,也就是其分配空间大小不同。

我们可以通过sizeof关键字来查看大小。sizeof不是一个函数

#include
int main() {
	int a = 10;
	short b = 20;
	long c = 30;
	long long d = 40;
	printf("%zdn", sizeof(int));
	printf("%zdn", sizeof(short));
	printf("%zdn", sizeof(long));
	printf("%zdn", sizeof(long long));

}

zd和d都可以使用。

得到的结果是

 其字节大小为4,2,4,8.

siezof不是一个函数,而是用来求一个变量或者类型的大小。

方法1   sizeof(类型名)    sizeof(int)

方法2  sizeof(变量名)      int a=20    sizeof(a)

方法3(不建议使用)  sizeof 变量名/类型名      sizeof   int 或     sizeof     a

4 无符号整型

signed表示有符号,unsigned表示无符号,只表示数据量,而没有正负,通常signed int xxx  xxx 形式不常用,前面的signed省略掉。

 而无符号需要指明。如 

unsigned int 名=值

其余命名规则则同有符号整型相同。

#include
int main() {
	int a = 3;
	short b = 4;
	long c = 5;
	long long d = 6;
	printf("sizeof(int)=%dn", sizeof(int));
	printf("sizeof(short)=%dn", sizeof(short));
	printf("sizeof(long)=%dn", sizeof(long));
	printf("sizeof(long long)=%dn", sizeof(long long));

	   unsigned int a2 = 3;
	   unsigned short b2 = 4;
	   unsigned long c2 = 5;
	   unsigned long long d2 = 6;
	printf("sizeof(  unsigned int)=%dn", sizeof(unsigned int));
	printf("sizeof(  unsigned short)=%dn", sizeof(unsigned short));
	printf("sizeof(  unsigned long)=%dn", sizeof(unsigned long));
	printf("sizeof(  unsigned long long)=%dn", sizeof(unsigned long long));



	return 0;
}

通过sizeof的计算可以得出以上的结果。其中需要注意的是long,在windows32或者64位都是4字节。而在linux里32位为4字节,64位为8字节。 

来对两种整型进行一个简单的格式匹配符归纳

非常重要,要熟记。

int   %d         unsigned int   %u

short  %hd    unsigned short  %hu

long  %ld         unsigned long   %lu 

long long %lld  unsigned long long    %llu

unsigned int a = 10;
	unsigned short b = 20;
	unsigned long c = 30;
	unsigned long long d = 40;
	printf("%un" ,a);
	printf("%hun", b);
	printf("%lun", c);
	printf("%llu", d);

如上。

在上面我们提到过的sizeof,其返回值为size-t。

size_t var = 10;
	printf("var=%d", var);

通过查看定义,我们可以发现size-t其实是一个无符号整型。

 在这里使用%d不报错是因为系统自行进行了更正。且sizeof

返回了一个无符号整数,相应的匹配符为%u。

5  字符类型

char字符类型:存储一个字符。‘a'  ’b‘  

其格式匹配符为 %c。

#include
int main() {
	char ch = 'a';
	printf("ch=%cn", ch);
	ch = 'm';
	printf("ch=%cn", ch);
	return 0;
}

非常容易可以得知,执行后会得到a,m两个结果。

再对其进行修改

ch = 97;
	printf("ch = % cn", ch);

得到97的那个值也是a。

 再看一个例子。

#include
int main() {
	char ch = 'A';
	printf("ch=%dn", ch);    //将匹配符改为了%d
	ch = 'm';
	printf("ch=%cn", ch);
	ch = 97;
	printf("ch = % dn", ch);   //同上
	return 0;
}

再看执行结果。

 由此可以得知,A对应的那个数为65,a对应的那个数为97

这就引出了asc码对照表了。

二进制十进制十六进制字符/缩写解释
00000000000NUL (NULL)空字符
00000001101SOH (Start Of Headling)标题开始
00000010202STX (Start Of Text)正文开始
00000011303ETX (End Of Text)正文结束
00000100404EOT (End Of Transmission)传输结束
00000101505ENQ (Enquiry)请求
00000110606ACK (Acknowledge)回应/响应/收到通知
00000111707BEL (Bell)响铃
00001000808BS (Backspace)退格
00001001909HT (Horizontal Tab)水平制表符
00001010100ALF/NL(Line Feed/New Line)换行键
00001011110BVT (Vertical Tab)垂直制表符
00001100120CFF/NP (Form Feed/New Page)换页键
00001101130DCR (Carriage Return)回车键
00001110140ESO (Shift Out)不用切换
00001111150FSI (Shift In)启用切换
000100001610DLE (Data Link Escape)数据链路转义
000100011711DC1/XON
(Device Control 1/Transmission On)
设备控制1/传输开始
000100101812DC2 (Device Control 2)设备控制2
000100111913DC3/XOFF
(Device Control 3/Transmission Off)
设备控制3/传输中断
000101002014DC4 (Device Control 4)设备控制4
000101012115NAK (Negative Acknowledge)无响应/非正常响应/拒绝接收
000101102216SYN (Synchronous Idle)同步空闲
000101112317ETB (End of Transmission Block)传输块结束/块传输终止
000110002418CAN (Cancel)取消
000110012519EM (End of Medium)已到介质末端/介质存储已满/介质中断
00011010261ASUB (Substitute)替补/替换
00011011271BESC (Escape)逃离/取消
00011100281CFS (File Separator)文件分割符
00011101291DGS (Group Separator)组分隔符/分组符
00011110301ERS (Record Separator)记录分离符
00011111311FUS (Unit Separator)单元分隔符
001000003220(Space)空格
001000013321!
001000103422"
001000113523#
001001003624$
001001013725%
001001103826&
001001113927'
001010004028(
001010014129)
00101010422A*
00101011432B+
00101100442C,
00101101452D-
00101110462E.
00101111472F/
0011000048300
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C
01011101935D]
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C|
011111011257D}
011111101267E~
011111111277FDEL (Delete)删除

我们可以利用asc表的关系来进行一个大小写转换。

#include
int main() {
	char ch = 'M';
	printf("%c", ch + 32);
	return 0;
}

这样得到的结果就是m了。

有几个比较重要的大家可以记一下。'a'    97     'A'   65    '0'    48     'n'    10    ''   0   

 再来看一个代码

	printf("'n'的值=%dn", 'n');
	return 0;

得到的结果却是

 这是怎么一回事呢?仔细去看,会发现n在其中扮演了回车换行的角色,而并未像我们所预想的那样直接按原样输出出来。

解决的办法就需要用到转义字符了。

转义字符: ''  将普通字符转为特殊意,或将特殊字符转为本身意。

'n'此时就是特殊意,回车换行,要更改回普通意就是'\n'

这样就可以得到想要的输出样式了。

转义字符意义ASCII码值(十进制)
a响铃(BEL)007
b退格(BS) ,将当前位置移到前一列008
f换页(FF),将当前位置移到下页开头012
n换行(LF) ,将当前位置移到下一行开头010
r回车(CR) ,将当前位置移到本行开头013
t水平制表(HT) 009
v垂直制表(VT)011
'单引号039
"双引号034
\反斜杠092

6 实型(浮点型)

浮点型是用来存储小数类型的。

float:单精度浮点型  4字节

float  v1 = 4.234;

double:双精度浮点型   8字节

double v2 =5.23232

格式匹配符为%f与%lf

来看一个代码。

int main() {
	float m = 3.145;
	double n = 4.566545;
	printf("m=%5.2fn", m);
	printf("n=%5.3lfn", n);
	return 0;
}

 之前我们知道了%.数可以控制小数点后面的位数,那%数1.数2中的数1又代表什么呢?

从调试结果可以知道数1控制着输出的位数,第一个输出结果可以看出,只有四位,不满足五位,便在数前空出一格凑满五位。

printf("m=%08.2fn", m);

在数1前加0,意思就是用0补齐。不常用此定义。


 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027072.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号