C语言常量与变量-学习三

2022-02-28 18:12:14 浏览数 (1)

C语言的数据类型

  • 基本数据类型最主要的特点是:其值不可在分解为其它类型。
  • 构造类型的值可以分解成为若干个“成员”“元素”。每个成员都是一个基本数据类型或又是一个构造类型

常量与变量

  • 定义:在程序执行过程中,其值不发生改变的量称为常量,其值可改变的量称为变量
  • 在程序中,常量是可以不经说明而直接引用的,而变量必须先定义后使用

常量

在程序执行过程中,其值不发生改变的量

  • 直接常量(字面常量):可以直接从字面值看出来。
    • 整型常量:1、5、0、-1
    • 实型常量:4.5、-1.28
    • 字符型常量:‘a’、‘b’、‘c’
  • 符号常量:用标识符代表一个常量,称之为符号常量。
  • 一般格式
    • #define 标识符 常量 例如:#define PI 3.1415926
      • 符号常量在使用前必须先定义
      • 习惯上,约定符号常量名大写变量名小写
例子

求圆的周长和面积。

代码语言:javascript复制
#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=%fn",circum,area);
}

变量

代表内存中具有特定属性的一个的存储单元,用来存放数据,也就是该变量的值。程序编译链接执行时由系统给每个变量名分配内存地址

  • 变量必须先定义后使用
代码语言:javascript复制
int a; //定义
a=10;  //使用
  • 标识符
    • 在C语言中用来对变量符号常量函数数组等数据对象命名的有效符号序列统称为标识符
    • 命名规则:
      • 只能由字母数字下划线三种字符组成
      • 且第一个字符必须为字母下划线,不能为数字
      • 不能使用关键字来命名标识符

例子:area   PI   _da   adw_1_0

注意:
  1. 编译系统将大写字母小写字母认为是两个不同的字符。
  2. 建议变量名长度最好不要超过8个字符。
  3. 在选择变量名和其它标识符时,应注意做到“见名知意”,即选择有含意的英文单词(或其缩写)作标识符。
  4. 要求对所有用到的变量作强制定义,也就是“先定义,后使用”。根据定义的数据类型,编译系统为变量分配存储空间。

整型数据

整型常量

  • 二进制整数:逢二进一(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 )

整型变量

  • 数据在内存中是以二进制形式存放的。
  • 如果定义了一个整型变量:
代码语言:javascript复制
 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

整型变量的定义

类型说明符 变量名标识符|,变量名标识符,...|;

代码语言:javascript复制
int a,b,c;  // a、b、c为整型变量
long x,y;   // x、y为长整型变量
unsigned q;  // q为无符号整型变量

注意:

  1. 允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。 类型说明符与变量名之间至少用一个空格间隔。
  2. 最后一个变量名之后必须以“;”分号结尾。
  3. 变量定义必须放在变量使用之前。 一般放在函数体的开头部分。
整型变量的溢出
代码语言:javascript复制
#include <stdio.h>

void main()
{
int a,b;
a = 32767;
b = a   1;

printf("%dn",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位有效位

浮点型变量的定义
代码语言:javascript复制
float a,b,c;  // a、b、c为单精度实数
double x,y;   // x、y为双精度实数
long double q; // q为长双精度实数
浮点型数据的舍入误差

由于实型变量是用有限的存储空间存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,因此会产生舍入误差。

例子
代码语言:javascript复制
#include <stdio.h>

void main()
{
float a,b;
a = 123456.789e5;
b = a   20;

printf("a = %fn,b = %fn",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进制数所代表的字符

除了“r”外,其余转义字符的跳格会取代原来屏幕上该位置显示的字符

字符型变量

  • 字符型变量用来存放字符常量,但只能存放一个字符。
  • 字符变量的定义形式如下: char c1,c2;
    • c1和c2为字符型变量,各可以放一个字符。
  • 对c1,c2赋值: c1 = 'a'; c2 = 'b';
字符数据在内存中的存储形式及其使用方法

将一个字符放到一个字符变量中,在内存单元中,是将该字符的相应的ASCII代码放到存储单元中。 如'a'的ASCI代码为97,'b'为98,内存变量c1、 c2的值如下图

效果: 字符数据以ASC1I码存储,与整数的存储形式类似,这样使字符数据和整型数据之间可以通用。因此,一个字符数据既可以以字符形式输出,也可以以整数形式输出,

例子

向字符变量赋以整数。

代码语言:javascript复制
#include <stdio.h>

void main()
{
    char c1, c2;
    c1 = 'a';
    c2 = 'b';

    printf("c1 = %c c2 = %cn", c1, c2);
    printf("c1 = %d c2 = %dn", c1, c2);
}

字符串常量

  • 定义:字符串常量是一对双引号括起来的字符序列。 如: “how are you?” 、 “CH I NA” 、“%#8ad72”
  • C语言规定:在每一个字符串的结尾加一个“字符串结束标志“”,以便系统据此判断字符串是否结束。
    • 在内存中:字符串存储为:字符串 ‘’;
    • 书写时:不必加‘’, 系统会自动加上‘’

练习

练习 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)说明不合法

答案

1、D   2、B   3、B   4、D

0 人点赞