(三)数据类型、运算符与表达式

3.1 C语言的数据类型

  • 基本类型
    整形、字符型、浮点型(单精度型、双精度型)、枚举类型
  • 构造类型
    数组类型、结构体类型、共用体类型
  • 指针类型
  • 空类型

3.2 常量与变量

3.2.1 常量和符号常量

1
2
# define PRICE 30
# include <stdio.h>

3.2.2 变量

变量代表内存中具有特定属性的一个存储单元,用来存放数据,也就是变量的值

在对程序年一连接时由编译系统给每一个变量名分配对应的的内存地址,从变量中取值,实际上是通过变量名找到对应的内存地址,从该存储单元中读取数据

C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线

3.3 整型数据

3.3.1 整型常量的表示方法

  • 十进制整数
    123,-456,
  • 八进制整数
    以0开头的数是八进制数,如0123表示八进制数123,其值等于十进制 18^2 + 2 8^1 + 3 * 8^0
  • 十六进制整数
    以0x开头的数是十六进制数,如0123代表十六进制123,其值等于十进制 1 16^2 + 2 16^1 + 3 * 16^0

3.3.2 整型变量

  • 整型数据在内存中的存放形式
    数据在内存中以二进制形式存放的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int i;//定义为整型变量
    i = 10;// 给i赋值以整数 10

    /*
    十进制数10的二进制形式为1010
    实际上,数值是以补码表示的。一个正整数的补码和该树的源码相同
    求负数的补码方法是:将该数的绝对值的二进制形式,按位取反再加1

    -10的补码

    10 的二进制形式 一个整数占16位
    0000000000001010
    取反
    1111111111110101
    +1
    1111111111110110
    */
  • 整型变量的分类

    • 基本整型 int 范围 -2^15 ~ 2^15-1 -32768 ~ 32768
    • 短整型 short int
    • 长整型 long int
    • 有符号基本类型 [signed] int;
    • 无符号基本类型 unsigned int;
    • 有符号短整型 [signed] short [int];
    • 无符号短整型 unsigned short [int];
    • 有符号长整型 [signed] long [int];
    • 无符号长整型 unsigned long [int];

如果不指定unsigned 或者指定 signed,则存储单元中最高位代表符号(0为正,1为负)
如果指定unsigned,为无符号型,存储单元中全部二进制bit用作存放数本身,而不包含符号
无符号变量只能存放不带符号的证书,如123,4578,而不能存放负数
一个无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍 为0 ~ 65535

short型都是16位
long型为32位
int型既可以是16位也可以是32位

  • 整型变量的定义

    1
    2
    3
    int a,b;
    unsigned short c,d;
    long e,f;
  • 整型数据溢出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # include <stdio.h>
    void main()
    {
    int a;
    short int b;//-32767 ~ 32767
    a = 32767;//0111111111111111
    b = a + 1;//1000000000000000
    printf("%d,%d\n", a, b)// 32767 -32768
    }

3.3.3 整型常量的类型

整型变量分为int,short int, long int,unsigned intm unsigned short, unsigned long

在将一个整型常量复制给上述几种类别的整型变量时如何做到类型匹配

  • 在-32768 ~ 32767 之间 认为是int型,可以赋值给int型或者long int型
  • 在-2147483648 ~ 2147483647 范围内,则认为是长整型,可以将它赋值给一个long int型变量
  • 一个整型常量后面加一个u或者U认为是unsigned int型,如果协程-123u,则先将-123转换成其补码然后再按照无符号数存储
  • 一个整常量后面加一个字母l或者L,则认为是long int型常量

3.4 浮点型数据

3.4.1 浮点型常量的表示方法

  • 十进制小数形式
    0.123
  • 指数形式
    123e3

3.4.2浮点型变量

  • 浮点型数据在内存中的存放形式
    一个浮点型数据一般在内存中占4个字节(32位),按照指数形式存储

    系统把一个浮点型数据分成小数部分和指数部分,分别存放,指数部分采用规范化的指数形式

    |+| . 3 1 4 1 5 9 | 1|

    数符 小数部分 指数
    • .314159 * 10^1 = 3.14159
  • 多少位表示小数部分,多少位标书指数部分无具体规定,由c语言编译系统自定,不少以24位表示小数部分,8为表示指数部分,小数部分bit越多,数的有效数字越多,精度也就越高。指数部分占的越多,表示数值范围越大
  • 浮点型变量的分类
    单精度 float 32位 6~7位有效数
    双精度 double 64位 15~16 位
    长双精度 long double 128位 18~19 位
  • 浮点类型数据的舍入误差
    print函数中%f 是输出浮点数时指定的格式符,作用是指定该实数以小数形式输出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # include <stdio.h>
    void main()
    {
    float a,b;
    a = 123456.789e5;
    b = 20;
    printf("%f\n",b);//12345678848.00000
    /*
    程序运行时输出b的值与a相等,a的值笔20大很多,a+20的理论只应该是12345678920,而一个浮点类型变量只能保证的有效数字是7位,后面的数字是无意义的,因此并不准确表示该数

    应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会丢失小数
    */
    }

3.4.3 浮点型常量的类型

C语言编译系统将浮点型常量作为双精度来处理。

3.5 字符型数据

3.5.1 字符常量

C语言的字符常量是用单引号括起来的一个字符’a’,’x’,’D’,’?’,’$’

C允许使用一种特殊形式的字符常量,以\开头

1
2
3
4
5
6
7
8
\n -> 换行
\t -> tab
\b -> 退格
\r -> 回车
\f -> 换页
\\ -> \
\' -> '
\'' -> ''

字符变量定义

1
2
3
4
5
char c1,c2;
c1 = 'a';
c2 = 'b';
printf('%c', c1);// a
printf('%d', c1);// 97

大小写字符转换

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
void main()
{
char c1,c2;
c1 = 'a';
c2 = 'b';
c1 = c1 - 32;
c2 = c2 - 32;
printf("%c %c", c1,c2);
}

3.5.4字符串常量

字符串常量是双引号引起来的字符序列

“how do you do”

不能把一个字符串常量赋给

C规定:在每一个字符串常量的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。C规定以字符’\0’作为字符串结束标志。’\O’是一个ASCII码为0的字符,为空操作字符,它既不其任何控制动作,也不是一个可现实的字符,如果有一个字符串常量”CHINA”,实际在内存中是 C H I N A \0 占内存单元不是5个字符而是6个字符

3.6 变量赋初值

3.7 各类数值型数据间的混合运算

3.8 算数运算符和算术表达式

3.9 赋值运算符和赋值表达式

3.10 逗号运算符和逗号表达式