目录
3.3.5 float、double和long double类型
3.1 数据
数据是所有能输入计算机并被计算机程序处理的符号的介质的总称,是用于输入电子计算机进行处理,具有一定意义的数字、字母、符号和模拟量等的通称。在计算机系统中,数据以二进制信息单元0、1的形式表示。
3.1.1 整数
C语言中的整数和数学概念一样,是指没有任何小数或指数部分的数。例如,256、-2和1024都是整数;而3.14、2.00则不是整数。
3.1.2 浮点数
C语言中的浮点数概念类似于数学中的实数,是具有分数形式或指数形式的数。例如,2.72、8.00、3.14E6和87e-2都是浮点数。
书写浮点数需要详细介绍e计数法,也叫指数计数法,类似于科学计数法:科学计数法的数字写法为a×10^b,其中a为小于10的数,b为整数。在指数计数法中用e或E取代10^。
数字
科学计数法
指数计数法
100000000
1.0×108
1.0e8
3140000
3.14×106
3.14e6
0.87
8.7×10-1
8.7e-1
3.2 变量与常量
生活中有些值是不变的(圆周率、血型、某事发生的日期),在C语言中,这些数据在程序运行期间没有变化,被称为常量。有些值是可变的(身高、体重、年龄),这些数据在程序运行期间可能被改变,被称为变量。
3.2.1定义变量
int main(void){
short age=20; //age为变量名,表示年龄
int high=170; //身高
float weight=63.5; //体重
return 0;
}
3.2.2变量分类
1.局部变量(local variable)
在函数内部的变量称为局部变量,作用域仅限于函数内部。
main()函数中定义的变量也是局部变量;同时,main()函数中也不能使用其他函数中定义的变量。
可以在不同函数中使用相同变量名,但应注意不要混淆。
2.全局变量(global variable)
在所有函数外部定义的变量称为全局变量,作用域默认是整个程序(包括.c和.h文件)。
3.2.3变量的作用域与生命周期
1.作用域(scope)
作用域是程序设计概念。通常来说,一段程序代码中所用到的名字并不总是有效/可用的。而限定这个名字的可用性的代码范围就是这个名字的作用域。
(1)局部变量的作用域:变量所在的局部范围。
(2)全局变量的作用域:整个工程。
2.生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
(1)局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
(2)全局变量的生命周期:整个程序的生命周期。
3.extern关键字
如果全局变量不在文件的开头定义,有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。
//简单理解,{}内部定义的变量是局部变量,{}外部定义的变量是全局变量
//在同一个范围内,变量不能重复定义
//全局变量和局部变量同名时,优先局部变量
#include<stdio.h>
int f1(void){
int sum;
int math=87,eng=72,comp=93; //局部变量
sum=math+eng+comp;
return sum;
}
extern int subject=3; //全局变量
int main(void){
int average; //局部变量
average=f1()/3;
printf("math=87,eng=72,comp=93,average=%d",average);
return 0;
}
3.2.4 常量
1.字面常量
字面常量(literal constant)是直接出现在代码中的固定值,也称为直接量。它们表示不同类型的常量数据,如整数常量、浮点数常量、字符常量、字符串常量等。字面常量只能引用不能修改,通常保存在程序符号表中。程序无法读取字面常量的地址,只有一个例外,即字符串常量。字符串常量存放在静态数据区,可以通过指针指向它,但不能通过指针修改该常量。
简单来说,字面常量的值就是字面本身,如整数25。
2.const修饰的常变量
const修饰的变量称为常变量,其是变量,但是具有常属性,即变量或对象的值是不能被更新的。可以这么说,变量是空间,常量是实际值;const只是锁定了值,但是并不能把空间变成数值。
虽然常变量在代码中不能被直接修改,它们仍然保持着变量的属性。这种机制在一定程度上可以提高程序的安全性和可靠性,因为它防止了意外的修改,同时也为代码的可读性和维护性提供了便利。
证明const修饰的常变量为变量的代码如下:
int main(void){
const int n=10;
int arr[n]={0}; //数组定义[]内必须是常量表达式
return 0;
}
//程序报错,显示n为变量
3.#define定义的标识符常量
#define是C语言中的预处理指令,用于定义常量。一旦定义后,该常量在程序中就可以作为一个标识符使用,通常用来代替固定的数值或字符串。
#include<stdio.h>
#define MAX 100
int main(void){
printf(“%d\n”,MAX);
MAX=200; //试图修改MAX的值
printf(“%d\n”,MAX);
return 0;
}
//程序报错,MAX为常量,定义后无法修改
4.枚举常量
enum 枚举类型名 {常量1,常量2,常量3,…};
数据类型为int类型(默认)。
enum Color{
red,
green,
blue
};
//枚举类型的这些名字不是变量,不会占据任何内存
int main(void){
enum Color c=RED //创建Color类型变量,此时向内存申请空间
return 0;
}
3.3 基本数据类型
下表列出C语言编程中常用的基本数据类型:
数据类型
存储大小
范围
char
1字节
-128到127
signed char
1字节
-128到127
unsigned char
1字节
0到255
short
2字节
-32768到32767
signed short
2字节
-32768到32767
unsigned short
2字节
0到65535
int
2或4字节
-32768到32767
signed int
2或4字节
-32768到32767
unsigned int
2或4字节
0到65535
short int
2字节
-32768到32767
signed short int
2字节
-32768到32767
unsigned short int
2字节
0到65535
long int
4字节
-2147483648到2147483647
signed long int
4字节
-2147483648到2147483647
unsigned long int
4字节
0到4294967295
float
4字节
double
8字节
long double
10字节
判断数据类型所占内存空间大小的代码:
int main(void){
printf(“%d\n”,sizeof(char)); //在一些编译器中可能会报警
printf(“%zu\n”,sizeof(char)); //%zu表示打印一个sizeof的无符号返回值,单位为字节
return 0;
}
3.3.1 int类型
int类型是有符号整型,可以具有零、正值和负值。
1.声明int变量
第二章中已经用int声明过单个整型变量:先写上int,然后写变量名,最后以分号结尾。要声明多个int变量,可以单独声明每个变量,也可在int后列出多个变量名,之间用逗号分隔:
int n;
int a,b,c;
2.初始化变量
变量获得值有三种途径:赋值;通过函数传递值;初始化变量。
初始化(initialize)变量就是为变量赋一个初始值,可以直接在声明中完成,其过程为为变量创建和标记存储空间并为其指定初始值。只需在变量名后面加上赋值运算符“=”和待赋给变量的值即可:
int totalNum=35,footNum=94;
int chicken,rabbits=12;
//正确,但是可读性差。
//最后一行只初始化了rabbits,并未初始化chicken。但这种写法容易被误认为chicken也被初始化为12,故不推荐采用
3.打印int
可以使用printf()函数打印int类型的值。第二章中介绍过的%d称为转换说明,指定了printf()应用什么格式来显示一个值。格式化字符串中的%d与待打印列表中的int值按序依次对应。这个值可以使int类型的变量、常量或值为int类型的表达式:
printf(“雉兔同笼,头有%d只,脚有%d只,雉有%d只,兔有%d只”,totalNum,footNum,12,totalNum-12)
4.八进制和十六进制的显示
在C语言中,不同的进制要使用不同的转换说明:十进制使用%d;八进制使用%o;十六进制使用%x;显示前缀0、0x和0X必须分别使用%#o、%#x、%#X。编译并运行以下程序:
//figure.c--以十进制、八进制、十六进制打印十进制数128
#include<stdio.h>
int main(void){
int x=128;
printf(“dec=%d,octal=%o,hex=%x\n”,x,x,x);
printf(“dec=%d,octal=%#o,hex=%#x\n”,x,x,x);
return 0;
}
输出结果如下:
dec=128,octal=200,hex=80
dec=128,octal=0200,hex=0x80
3.3.2 其他整数类型
C语言提供3个附属关键字修饰基本整数类型:short、long和unsigned。
打印unsigned int类型的值,使用%u转换说明;打印long类型的值,使用%ld转换说明(%lx表示以十六进制打印long类型整数;%lo表示以八进制打印long类型整数);打印short类型的值,可以使用h前缀(%hd表示以十进制打印short类型整数;%ho表示以八进制打印short类型整数);对于支持long long类型的系统,%lld和%llu分别表示有符号和无符号类型。第四章顺序结构中将详细介绍转换说明。
如果整数超出了相应类型的取值范围会发生整数溢出。以下列代码为例讲解整数溢出:
//程序power.c实现的功能是从2的0次方加到2的63次方
#include<stdio.h>
int main(void){
int i,j,sum;
i=1;
sum=0;
for(j=1;j<=63;j++){
sum=sum+i;
i=i*2;
}
printf("%d",sum);
return 0;
}
整数溢出可分为三类:存储溢出,是使用另外的数据类型来存储整数造成的;运算溢出,是对整型变量进行运算时没有考虑到其边界范围;符号问题,是程序员忽略了符号。
Unsigned int类型的变量达到能表示的最大值时会从0开始,而int类型的变量则从-2147483648开始。
power.c中由于发生了运算溢出,导致输出数据由1.8446744e19-1变为-1。
3.3.3 char类型
char类型用于存储字符,但从技术层面来看,char类型实际上存储的是整数而不是字符。计算机使用数字编码即特定整数表示特定字符。关于ASCII码的知识在第〇章中已讲过,在此不再赘述。
1.声明char类型变量
char类型变量的声明方式与其他类型变量的声明方式相同。
2.字符常量的初始化
如果要把一个字符常量初始化为字母A,只需直接将字母A赋给grade即可:
char grade=’A’;
在C语言中,用单引号括起来的单个字符被称为字符常量(character constant)。单引号必不可少。以下是一些例子:
char grade; //声明一个char类型的变量
grade=’A’; //正确赋值
grade=A; //错误,A为变量
grade=”A”; //错误,A为字符串
grade=65; //正确,对于ASCII可以,但是一种不好的编码风格
需要注意的是,C语言将字符常量视为int类型而非char类型。利用这个特性,定义的字符常量’FATE’也是有效的,相当于把4个独立的8位ASCII码存储在一个32位的存储单元中。
3.非打印字符
有些字符无法打印出来(例如,退格、换行)。C语言提供了三种方法表示这些字符:
①使用ASCII码。
②使用特殊符号序列,即转义字符(escape sequence)。使用转义序列赋给字符变量时,必须用单引号把转移序列括起来。转义字符序列如下表所示:
转义序列
含义
\a
警报(ANSI C)
\b
退格
\f
换页
\n
换行,也可用于刷新缓冲区
\r
回车
\t
水平制表符(实现Tab键功能)
\v
垂直制表符
\\
反斜杠(\),防止它被解释为一个转义序列符
\’
单引号
\”
双引号
\?
问号(在书写连续多个问号时使用,防止它们被解析成三字母词)
\0oo
八进制(oo必须是有效的八进制数,即每个o可表示0-7中的一个数)
\xhh
十六进制(HH必须是有效的十六进制数,即每个h可表示0-f中的一个数)
\0
字符串结束标志
需要注意的是,这些转义字符不一定在所有的显示设备上都能起作用。例如,换页符和垂直制表符在PC屏幕上会生成奇怪的符号,只有将其输出到打印机上时才会产生描述的效果。
③从C90开始,可以用十六进制形式表示字符常量,即反斜杠后面跟一个x或X,再加上1-3位十六进制数字。例如,’\x41’表示’A’,’\x61’表示’a’。
4.打印字符
由于一个字符变量实际上被存储为1字节的整数值,因此用%d打印char类型变量的值打印的是一个整数,而%c才是打印该整数对应的字符。
5.有符号还是无符号
有些编译器将char视为有符号类型,有些则将其视为无符号类型。具体请参照相应的编译器手册。
3.3.4 _Bool类型
_Bool类型用于表示布尔值,即逻辑值true或false,也是一种整数类型,占用1位存储空间。
3.3.5 float、double和long double类型
C语言中的浮点类型有float、double和long double类型。浮点数的表示主要分为三个部分:
①符号位:符号位为0表示正数,为1表示负数。
②阶码:在float中占用8位,在double中占用11位。用来表示浮点数的数量级,即指数部分。
③尾数(有效数):在float中占用23位,在double中占用52位。用来表示浮点数的有效数字部分,即其小数部分。
1.声明浮点型变量
浮点型变量的声明和初始化方式与整型变量相同。
2.浮点型常量
默认情况下,编译器假定浮点型常量是double类型的精度。在浮点数后面加上f或F可覆盖默认设置,使编译器将浮点数看做float类型。
3.打印浮点值
关于如何通过设置字段宽度和小数位来控制输出格式的方法将在关于printf()函数的内容中详细展开。
当浮点数超出当前类型所能表达的范围时,会发生上溢(overflow):
#include<stdio.h>
main(void){
float toobig=3.14e38*100.0f;
printf(“%e\n”,toobig); //%e是以指数的形式输出
return 0;
}
//这种情况下会给toobig赋一个表示无穷大的特定值,而且printf()显示该值为inf或infinity(或者具有无穷含义的其他内容)
当浮点数的阶码值太小,超出所能表示的最小负数,会发生下溢(underflow):
#include<stdio.h>
main(void){
float toosmall=0.1234e-10/10f;
printf(“%e\n”,toosmall);
return 0;
}
//这时尾数部分会向右移,超出部分会被丢弃,得到的结果是0.0123e-10
//损失了类型全精度的浮点值称为低于正常的(subnormal)浮点值,其尾数位隐藏的整数部分为0
标签:第三章,常量,int,整数,C语言,类型,字节,变量,入门
From: https://blog.csdn.net/2301_78959712/article/details/139523897