关于c:C程序设计-02-数据类型

0次阅读

共计 3801 个字符,预计需要花费 10 分钟才能阅读完成。

一、常量与变量

1. 常量

  1. 整形常量
  2. 实型常量

    • 十进制小数模式
    • 指数模式:\(12.34e3\)(代表 \(12.34\times 10^3\))
  3. 字符常量

    • 一般字符:用单引号示意,单引号里只能有一个字符。字符变量以 ASCII 代码的模式贮存
    • 转义字符

      转义字符 字符值 输入后果
      \\a 正告 alert 产生视觉或声音信号
      \\b 退格 backspace 将光标以后地位后退一个字符
      \\f 换页 form feed 将光标地位移到下一页结尾
      \\n 换行 将光标地位移到下一行结尾
      \\r 回车 carriage return 将光标地位移到本行结尾
      \\t 程度制表符 将光标地位移到下一个 Tab 地位
      \\v 垂直制表符 将光标地位移到下一个垂直制表符对齐点
      \\o\\oo\\ooo(其中 o 代表一个八进制数字) 与该八进制码对应的 ASCII 字符
      \\xh[h...](其中 h代表一个十六进制数字) 与该十六进制码对应的 ASCII 字符
  4. 字符串:用双引号示意
  5. 符号变量:用 #define 指令,指定用一个符号代表一个常量

    #define PI 3.1416

符号常量不是变量!符号常量不占用内存,只是作为一个长期符号,代表一个值,在预编译后这个符号就不存在了,一次不能对符号变量从新赋值。为与变量名区别,习惯上符号常量用大写字母示意。

2. 变量

变量必须先定义后应用。变量名理论是以一个名字代表的存储地址。编译时,零碎给每一个变量名调配对应的内存地址。从表变量中取值,实际上是通过变量名找到对应的内存地址,从该存储单元中读取数据。

3. 常变量

C99 规范容许应用常变量,办法是定义变量时在后面加一个 const,该变量存在期间其值不能扭转。

常变量与常量:

  • 常变量具备变量的根本属性:有类型,占存储单元,只是不容许扭转值。
  • 常变量是有名字的不变量,常量是无名字的不变量。

常变量与符号变量:

  • 符号变量是预编译指令,它只是用符号常量代表一个字符串,在预编译时仅进行字符替换,编译后符号常量就不存在了(被值代替),符号常量的名字不调配存储单元。
  • 串并联占用存储单元,有变量值,只是不能扭转。
  • 从应用上看,常变量具备符号变量的长处,而且应用更不便,有常变量时能够不应用符号常量。但有些编译系统还未实现 C99 的性能,不能应用常变量。

4. 标识符

用来对常量名、函数、数组、类型等命名的无效字符序列统称为标识符(identifier)。标识符就是一个对象的名字。

C 语言规定标识符只能由字母、下划线、数字组成,且第一个字符必须为字母。大小写字母是两个不同的字符。习惯上变量名应用小写字母。

二、数据类型

类型是指对数据调配存储单元的安顿,包含存储单元的长度 (占多少字节) 一级数据的存储形式。不同的类型调配不同的长度和贮存模式。
计算机进行的计算不是形象的理论值的计算,而是用工程的办法实现的计算,在许多状况下只能失去近似的后果。
C99 容许应用的类型包含:

根本类型和枚举类型的变量都是数值,统称为算术类型(arithmetic type)。算术类型和指针类型的变量都是用数字来示意的,统称为纯量类型(scalar type)。枚举类型是程序中用户自定义的整数类型。数组类型和构造体类型统称为组合类型(aggregate type)。共用体类型不属于组合类型,因为在同一时间内只有一个成员具备值。

1. 整形

C 规范没有规定各种类型数据占用的存储单元长度,这是由编译系统自行决定的。如 Turbo C 2.0 为每个 int 调配 2 个字节 (16 个二进位),而 Visual C++ 调配 4 个字节(32 个二进位)。C 规范只要求 long 型数据长度不短于 int 型,short 型不长于 int 型,long long 型最长。
能够应用 sizeof(int) 来查看类型或变量的长度。将一个程序移植到另一个零碎时,要留神因为编译系统的不同引起的数据溢出。
存储单元存储整数的办法是:应用整数的补码(complement)。

  • 一个负数的补码是其二进制模式。
  • 求正数的补码,先将其绝对值写成二进制模式,让后对其二进制按位取反,再加 1

在贮存整数的贮存单元中,最右边的一位是用来示意符号的,如果为 0,示意数值为正;如果为 1,示意数值为负。由此能够失去整数型数据的范畴(按 Visual C++):

类型 字节数 取值范畴
根本整型 int 4 \(-2^{31} \sim (2^{31}-1)\)
无符号根本整型 unsigned int 4 \(0\sim (2^{32}-1)\)
短整型 short 2 \(-2^{15}\sim (2^{15}-1)\)
无符号短整型 unsigned short 2 \(0\sim (2^{16}-1)\)
长整型 long 4 \(-2^{31} \sim (2^{31}-1)\)
无符号长整型 unsigned long 4 \(0\sim (2^{32}-1)\)
双长型 long long 8 \(-2^{63}\sim (2^{63}-1)\)
无符号双长型 unsigned long long 8 \(0\sim (2^{64}-1)\)

修饰符 unsigned 示意无符号类型,即只能取正值。应用 signed 示意有符号类型,通常省略 signed。有符号整形的最高位示意数值的符号,如果指定为无符号类型,则存储单元中所有的二进制位都用来存放数据自身,因而无符号整形能够寄存的负数范畴比有符号整型扩充一倍。
只有整型数据能够用 signedunsigned 润饰,实型数据不能。无符号整型数据用 %u 格局输入。

2. 字符型

因为字符型是依照其代码模式存储的,因而 C99 把字符型数据作为整型数据的一种。
各种字符集 (包含 ASCII 字符集) 的根本集都包含 127 个字符:

  • 大小写字母。
  • 数字:0-9。
  • 专门符号 29 个:! & < 等。
  • 空格符:空格、制表符、换行符等。
  • 不能显示的字符:空 (null) 字符 \0、正告、退格等。

以类型符 char 定义字符变量,能够将 0-127 之间的整数赋值给字符变量,输入时也能够抉择以十进制整数模式或字符模式输入。

char c;
c = 64;
printf("%d %c\n", c, c);

// 64 @

字符类型属于整数类型,能够应用 signedunsigned 润饰。127 个字符能够用 7 个二进位来示意,C 语言中指定用一个字节 (8 位) 贮存一个字符(所有零碎都不例外),此时,字节中的第一地位为 0。有些零碎提供的字符集拓展到了 255 个字符,此时须要把二进位中不必的那一位用起来,把 char 批改为 unsigned char

3. 浮点型

浮点型数据表示具备小数点的实数。C 语言中实数是以指数的模式放在存储单元的,因为一个实数的的指数模式不止一种,即小数点是能够浮动的,因而称为浮点型。

编译系统位 float 型变量调配 4 个字节,将小数局部和指数局部别离寄存,4 个字节 (32 位) 中小数局部和指数局部别离占多少位由编译系统自行决定。因为用二进制示意一个实数以及存储单元长度无限,因而不可能失去齐全准确的值。小数局部位数越多,精度越高;指数局部位数越多,能示意的数据范畴越大。float 型数据能失去 6 位有效数字,数值范畴为 \(-3.4\times 10^{-38} \sim 3.4 \times 10^{38}\)。

为了扩充能示意的数据范畴,用 8 个字节贮存一个 double 型数据,能够失去 15 位有效数字,数值范畴位 \(-1.7\times 10^{-308} \sim 1.7 \times 10^{308} \)。为了进步计算精度,C 语言在进行浮点数的算术运算时,将 float 型数据都主动转为 double 型数据,而后进行运算。

不同的编译系统对 long double 的解决形式不同。Turbo C 对 long double 型调配 16 个字节,而 Visual C++ 对 long doubledouble 的解决形式一样,都调配 8 个字节。

三、运算符和表达式

C 语言提供以下运算符:

  • 算术运算符:+ - * / % ++ --
  • 关系运算符:> < == >= <= !=
  • 逻辑运算符:! && ||
  • 位运算符:<< >> ~ | ^ &
  • 赋值运算符:=
  • 条件运算符:?:
  • 逗号运算符:,
  • 指针运算符:* &
  • 求字节运算符:sizeof
  • 强制类型运算转换符:(type)
  • 成员运算符:. ->
  • 下标运算符:[]
  • 其余:如函数调用运算符 ()

1. 根本算数运算符

运算符 含意
+ 正号或加法
- 负号或减法
* 乘号
/ 除号
% 取余

两个实数相除,后果为双精度实数。两个整数相除,后果位整数,舍去小数局部,但如果后果为正数,舍去的方向是不肯定的,由编译系统决定。少数编译系统采取“向零取整”的办法,即取整后向零聚拢。

2. 自增自减运算符

自增和自减运算符的作用是使变量的值加 1 或减 1:

  • ++i--i:应用 i 之前,先使 i 的值加(减)1
  • i++i--:应用 i 之后,使 i 的值加(减)1
int i = 3;
printf("%d\t", i++);
printf("%d\n", ++i);

// 3    5

3. 算术表达式与运算符的优先级与联合性

C 语言规定运算符是优先级:如先乘除后加减。

如果一个运算对象两侧的运算符优先级雷同,则按规定的“联合方向”解决:算术运算符的联合方向都是自左向右,赋值运算符的联合方向是自右向左。“联合性”是 C 语言独有的个性之一。

4. 不同数据类型的混合运算

  • 运算的两个数中有 floatdouble 时,后果位 double
  • 字符型数据与整型或实型数据进行运算时,会先将字符型转换为整型或实型。

5. 强制类型转换符

应用 (类型)(表达式) 能够将一个表达式强制转换为所需的模式。

(float)(5%3)

Reference:

谭浩强《C 程序设计(第五版)》

正文完
 0