随风而动,随遇而安......
C语言常量与变量-学习三
C语言的数据类型
- 基本数据类型最主要的特点是:其值不可在分解为其它类型。
- 构造类型的值可以分解成为若干个“成员”或“元素”。每个成员都是一个基本数据类型或又是一个构造类型。
常量与变量
- 定义:在程序执行过程中,其值不发生改变的量称为常量,其值可改变的量称为变量。
- 在程序中,常量是可以不经说明而直接引用的,而变量则必须先定义后使用。
常量
在程序执行过程中,其值不发生改变的量
直接常量(字面常量):可以直接从字面值看出来。
- 整型常量:1、5、0、-1
- 实型常量:4.5、-1.28
- 字符型常量:‘a’、‘b’、‘c’
- 符号常量:用标识符代表一个常量,称之为符号常量。
一般格式:
#define 标识符 常量
例如:#define PI 3.1415926- 符号常量在使用前必须先定义
- 习惯上,约定符号常量名用大写,变量名用小写
例子
求圆的周长和面积。
#include <stdio.h>
#define PI 3.1415926
void main()
{
int r;
float circum,area;
r = 5;
circum = 2 * r * PI;
area = r * r * PI;
printf("circum=%f,area=%f\n",circum,area);
}
变量
代表内存中具有特定属性的一个的存储单元,用来存放数据,也就是该变量的值。程序编译链接执行时由系统给每个变量名分配内存地址。
- 变量必须先定义后使用
int a; //定义
a=10; //使用
标识符
- 在C语言中用来对变量、符号常量、函数、数组等数据对象命名的有效符号序列统称为标识符。
命名规则:
- 只能由字母、数字、下划线三种字符组成
- 且第一个字符必须为字母或下划线,不能为数字!
- 不能使用关键字来命名标识符
例子:area PI _da adw_1_0
注意:
- 编译系统将大写字母和小写字母认为是两个不同的字符。
- 建议变量名的长度最好不要超过8个字符。
- 在选择变量名和其它标识符时,应注意做到“见名知意”,即选择有含意的英文单词(或其缩写)作标识符。
- 要求对所有用到的变量作强制定义,也就是“先定义,后使用”。根据定义的数据类型,编译系统为变量分配存储空间。
整型数据
整型常量
- 二进制整数:逢二进一(0,1)。如1010(换算十进制:0*2º + 1*2¹ + 0*2² + 1*2³ = 10 )
- 八进制整数:以“0”开头(0-7)。如:0123 (换算十进制:3*8º + 2*8¹ + 1*8² = 83 )
- 十进制整数。如:123、60、0、-123
- 十六进制整数:以“0x”开头(0-9,A-F可小写(a-f))。如:0x123 (换算十进制:3*16º + 2*16¹ + 1*16²= 291 )
整型变量
- 数据在内存中是以二进制形式存放的。
- 如果定义了一个整型变量:
int i; //定义为整型变量
i = 10; //给 i 赋值整数10
十进制10的二进制为1010;八进制为012;十六进制为0xA
在内存中,数值是以补码的形式表示的。
- 正数的补码、反码和其原码形式相同。
- 求负数的补码方法:
将该负数的绝对值的二进制形式(原码),按位取反(反码)再加1(补码)
例子
-10的绝对值的原码:
反码
反码再加1,得到补码
在存放整数的存储单元中,最左面的一位是符号位,该位为0表示该整数位正数,该位为1表示为负数。
整型变量的分类
类型 | 类型说明符 | 数的范围 | 字节数 |
---|---|---|---|
基本型 | int (16位) | -32768~32767 即-2^15 ~ (2^15-1) | 2 |
无符号基本型 | unsigned[int] (16位) | 0~65535 即0 ~ (2^16-1) | 2 |
基本型 | int (32位) | -2147483648 ~ 2147483647 即-2^31 ~ (2^31-1) | 4 |
无符号基本型 | unsigned[int] (32位) | 0~4294967295 即0 ~ (2^32-1) | 4 |
短整型 | short[int] (16位) | -32768~32767 即-2^15 ~ (2^15-1) | 2 |
无符号短整型 | unsigned short [int] (16位) | 0~65535 即0 ~ (2^16-1) | 2 |
长整型 | long [int] (32位) | -2147483648~2147483647 即-2^31 ~ (2^31-1) | 4 |
无符号长整型 | unsigned long [int] (32位) | 0~4294967295 即0 ~ (2^32-1) | 4 |
整型变量的定义
类型说明符 变量名标识符,变量名标识符,...;
int a,b,c; // a、b、c为整型变量
long x,y; // x、y为长整型变量
unsigned q; // q为无符号整型变量
➢注意:
- 允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。
类型说明符与变量名之间至少用一个空格间隔。 - 最后一个变量名之后必须以“;”分号结尾。
- 变量定义必须放在变量使用之前。 一般放在函数体的开头部分。
整型变量的溢出
#include <stdio.h>
void main()
{
int a,b;
a = 32767;
b = a + 1;
printf("%d\n",b);
}
a: 01111111 11111111 + 1 = 10000000 00000000 即-32768 ,正确答案应该是 32768,这就是溢出
注意现在的VS编译器默认int为32位,溢出效果看下图
浮点型数据
实型常量
实数(real number) ,又称浮点数(floating-point number) 。
十进制小数形式
- 由数字和小数点组成(必须有小数点)
如:.123、123. 、23.01 、0.0
- 由数字和小数点组成(必须有小数点)
指数形式
- 数字 + e (E) + 整数,字母e (或E)之前必须有数字,且e后面的指数必须为整数。
- 如: 123e3=123*10³、 0.122e0
- 内存中存放形式
一个浮点型数据一 般在内存中占4个字节。在内存中按照指数形式存储。不少C语言编译系统用24位表示小数部分(包括符号),8位表示指数部分。
- 计算机中,二进制表示小数部分,2的幂次表示指数部分。
- 小数部分占的位数越多,数的有效数字越多,精度越高。
- 指数部分占的位数越多,则能表示的数值范围越大。
浮点型变量的分类
类型 | 类型说明符 | 数的范围 | 字节 | 有效位 |
---|---|---|---|---|
单精度 | float | 1.2E-38 ~ 3.4E+38 | 4 | 7位有效位 |
双精度 | double | 2.3E-308 ~ 1.7E+308 | 8 | 15位有效位 |
长双精度型 | long double | 3.4E-4932 ~ 1.1E+4932 | 16 | 19位有效位 |
浮点型变量的定义
float a,b,c; // a、b、c为单精度实数
double x,y; // x、y为双精度实数
long double q; // q为长双精度实数
浮点型数据的舍入误差
由于实型变量是用有限的存储空间存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,因此会产生舍入误差。
例子
#include <stdio.h>
void main()
{
float a,b;
a = 123456.789e5;
b = a + 20;
printf("a = %f\n,b = %f\n",a,b);
}
理论值:
- a=12345678900
- b=12345678920
实际值:
原因:一个单精度实型变量只能保证的有效数字是7位,7位后面的数字是无意义的,并不准确地表示该数。7位是指整数部分 和 小数部分一共7位。
注意:在C程序中,应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。
字符型数据
字符型常量
- 用单引号包含的一个字符
- 只能包含一个字符
如:‘a’、‘#’、‘6’、‘’ - ‘a’和‘A’ 是不同的字符常量。
- 字符常量只能用单引号括起来,不能用双引号或其它括号。
- 字符常量只能是单个字符,不能是字符串。
字符‘1’和整数1是不同的概念:
- 字符‘1’只是代表一个形状为‘1’的符号,在需要时按原样输出,在内存中以ASCII码形式存储占1个字节。
- 整数1是以整数存储方式(二进制补码方式)存储的,占2个字节。
转义字符
以“\”开头的特殊字符
字符形式 | 含义 |
---|---|
\n | 换行,将当前位置移到下一行开头 |
\t | 水平制表(跳到下一个tab位置,8位为一个tab位置) |
\b | 退格,将当前位置移到前一列 |
\r | 回车,将当前位置移到本行开头 |
\f | 换页,将当前位置移到下页开头 |
\\ | 反斜杠字符 |
\‘ | 单撇号字符 |
\“ | 双撇号字符 |
\ddd | 1到3位8进制数所代表的字符 |
\xhh | 1到2位16进制数所代表的字符 |
字符型变量
- 字符型变量用来存放字符常量,但只能存放一个字符。
字符变量的定义形式如下:
char c1,c2;
- c1和c2为字符型变量,各可以放一个字符。
- 对c1,c2赋值:
c1 = 'a'; c2 = 'b';
字符数据在内存中的存储形式及其使用方法
将一个字符放到一个字符变量中,在内存单元中,是将该字符的相应的ASCII代码放到存储单元中。
如'a'的ASCI代码为97,'b'为98,内存变量c1、 c2的值如下图
效果:
字符数据以ASC1I码存储,与整数的存储形式类似,这样使字符数据和整型数据之间可以通用。因此,一个字符数据既可以以字符形式输出,也可以以整数形式输出,
例子
向字符变量赋以整数。
#include <stdio.h>
void main()
{
char c1, c2;
c1 = 'a';
c2 = 'b';
printf("c1 = %c c2 = %c\n", c1, c2);
printf("c1 = %d c2 = %d\n", c1, c2);
}
字符串常量
- 定义:字符串常量是一对双引号括起来的字符序列。
如: “how are you?” 、 “CH I NA” 、“%#8ad72” C语言规定:在每一个字符串的结尾加一个“字符串结束标志“\0”,以便系统据此判断字符串是否结束。
- 在内存中:字符串存储为:字符串+‘\0’;
- 书写时:不必加‘\0’, 系统会自动加上‘\0’
练习
1、___是合法的用户自定义标识符。
(A)b-b
(B)float
(C)3sd
(D)_isw
2、以下所列的C语言常量中,错误的是___。
(A)0xFF
(B)1.2e0.5
(C)“asd”
(D)‘a’
3、下面四个选项中,均是不合法的浮点数的选项是___。
(A)160. 0.12 e3
(B)123 2e4.2 .e5
(C)-.18 123e4 0.0
(D)-.e3 .234 1e3
4、若有说明语句: char c='\729';则变量c___。
(A)包含1个字符
(B)包含2个字符
(C)包含3个字符
(D)说明不合法