《C语言学习笔记》变量和数据类型

c/c++

浏览数:234

2019-3-29

今天刚刚翻看了自己当初学习C语言时候的笔记,发现感触挺深的,正好这个时候正是自己的复习阶段,就拿过来复习一下吧

第一个C语言程序

程序:为解决特定的问题而用计算机语言编写的有序指令序列的集合

#include<stdio.h>

int main(void){
    printf("Hello World");
    return 0;
}

这个程序需要回答以下几个问题:

程序是如何执行的 ?

  • 编辑:通过程序员的编写,形成源代码文件,源代码文件包括两个部分:源文件(.c)(>=1个)头文件(.h)(>=0个)。源文件和头文件在实际目录中是在同一层目录之下的,而我们在编译器中看到的则是一个虚拟目录,自动分成的目录。
  • 编译:通过编译将源文件翻译成二进制文件目标文件(.obj),进行语法错误的检查。编译过程中,是以源文件为基本单位的。
  • 链接:将编译的到的所有的目标文件通过链接形成唯一的一个可执行性的文件(.exe)
  • 执行:得到程序运行的结果
  • 调试(debug)也是一个环节,但对于个别小程序来讲,调试不是必须的过程。

对上面程序是如何理解的 ?

  • 上面程序中用到了头文件,头文件也叫预处理文件,由标识符#、预处理指令include和头文件组成。#include是预处理指令,它的作用是将指定的头文件内容放到预处理指令的所在位置。
  • 头文件是一个标准的函数库,头文件名用来指名你使用的库函数所在的文件名,程序中使用printf库函数包含在stdio.h(stdio表示standard input/output)
  • 头文件的执行是通过源文件来执行的,头文件不参与编译过程,头文件有两种形式
    <>表示系统文件,即表示预处理的文件从系统规定的位置寻找头文件
    ""表示当前目录下的头文件,即表示预处理的文件先从当前目录下进行寻找,若通过,继续进行下面的编译,若没有再从系统中寻找头文件。
  • main函数是可执行程序的入口函数。一个C程序有且只有一个main函数

变量

问题的求解需要用到算法,算法主要有以下几个特征:

  • 有穷性
  • 确切性
  • 可行性
  • 一个算法有零个或多个输入
  • 一个算法有一个或多个输出

变量的定义:

  • 程序中通过数据类型定义变量来表示自己需要的数据,可以给内存中一块连续的空间起一个名字,通过这个名字来操作它,这个名字就是变量名,也叫做标识符
  • 变量定义必须放在变量使用之前。一般放在函数体的开头部分。

变量声明的基本语法:

/*数据类型  变量名1, 变量名2 …, 变量名n;*/

int a;// 定义了一个变量a,a的数据类型是int型

变量命名的规范:

  1. 变量名由数字,字母和下划线_组成
  2. 数字不能打头
  3. 不能使用C语言中的关键字
  4. C语言的变量名中的字母区分大小写
  5. 变量名应该尽量有意义,参考编程规范

变量的赋值:

变量可以先定义再赋值,也可以在定义的同时进行赋值;在定义变量的同时赋初值称为初始化
注意,在定义中不允许连续赋值,如a=b=c=5是不合法的

常考试题:
D )是合法的用户自定义标识符。
A.case(关键字) B.123f(数字) C. #html5(符号) D. _int

数据类型

整型数据

整型数据的分类和范围

  • short 2个字节
  • int 2/4个字节(8位和16位系统是2字节,32位系统是4字节,64位系统还是4字节)
  • long 4/8个字节(除了64位系统是8字节,其他都是4字节)
  • long long intlong long 8个字节 (VC6.0不支持,是在C99中添加的)

整型数据可以分为符号型和无符号型 ,前缀带有unsigned的都是无符号型。在同一个编译器和系统下,有符号无符号表示的字节都是相同的

不同的系统必须满足sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)

各类型长度:

// short int
short int(2字节占16位) :-(2^15-1)~(2^15-1),即-32767~32767
unsigned short int(2字节占16位):0~(2^16-1),即0~65535

// int
int(32/64位系统,4字节占32位):-(2^31-1)~(2^31-1),即-2147483647 ~2147483647
unsigned int(32/64位系统,4字节占32位):0~(2^32-1),即0 ~ 4294967295

// long int
long int(非64位系统,4字节占32位):-(2^31-1)~(2^31-1),即-2147483647 ~2147483647
unsigned long int(非64位系统,4字节占32位):0~(2^32-1),即0 ~ 4294967295
long int(64位系统,8字节占64位):-(2^63-1)~(2^63-1),即 -9223372036854775807~9223372036854775807
unsigned long int(64位系统,8字节占64位):0~(2^64-1),即 0~18446744073709551615

// long long int
long long int(8字节占64位):-(2^63-1)~(2^63-1),即 -9223372036854775807~9223372036854775807
unsigned long long int(8字节占64位):0~(2^64-1),即 0~18446744073709551615

无符号类型长度总比有符号类型长度多一位,比如16位int是±2^15-1,16位unsigned int却是2^16-1,是因为有符号整型需要一个位去作为符号位,用于表示正负,所以少一位;而无符号整型不需要符号位,所有位全部用于表示整数。

整型数据在内存中存放的方式

  • 在内存中数值是以补码的形式存储的
  • 有符号整数在内存中的存储
    正数:原码、补码、反码相同
    负数: 原码:数值的二进制表示 反码:符号位不变,数值的二进制按位取反 补码:数值的反码加1

整型数据的表示方法

  • 十进制数:十进制数没有前缀。其数码为0~9。
    以下是合法的十进制数:237、-568、65535、1627
    以下是不合法的十进制数:023 (不能有前导0)、23D (非十进制数码)。
  • 八进制数:八进制数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数
    以下是合法的八进制数:015(十进制为13)、0101(十进制为65)、0177777(十进制为65535);
    以下是不合法的八进制数:256(无前缀0)、03A2(包含了非八进制数码)、-0127(出现了负号)。
  • 十六进制数:十六进制数的前缀为0X或0x。其数码取值为0~9,A~F或a~f
    以下是合法的十六进制数:0X2A(十进制为42)、0XA0 (十进制为160)、0XFFFF (十进制为65535);
    以下是不合法的十六进制数:5A (无前缀0X)、0X3H (含有非十六进制数码)。

字符型数据

字符型数据是用单引号括起来的一个字符。例如:'a'、'b'、'='、'+'、'?'都是合法字符型数据。

  • 字符型数据只能用单引号括起来,不能用双引号或其它括号。
  • 字符型数据只能是单个字符,不能是字符串。
  • 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如'5'5是不同的。’5’是字符型数据,不能参与运算。

转义字符
转义字符是一种特殊的字符。转义字符以反斜线"\"开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称 “转义” 字符。
转义字符主要用来表示那些用一般字符不便于表示的控制代码:

转义字符 转义字符的意义 ASCII代码
\n 回车换行 10
\t 横向跳到下一制表位置 9
\b 退格 8
\r 回车 13
\f 走纸换页 12
\\ 反斜线符”” 92
\' 单引号符 39
\" 双引号符 34
\a 鸣铃 7
\ddd 1~3位八进制数所代表的字符
\xhh 1~2位十六进制数所代表的字符

字符类型说明符

字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。例如:char a,b;
每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。

由ASCII码可以看出:

  • 小写的ASCII码比大写的ASCII码大32,常用的a为97 A为65
  • 后面的ASCII码比前面的ASCII码大
  • '3'要变化成3需要'3'-'0'=3

字符串

字符串是由一对双引号括起的字符序列。例如: "CHINA" ,"C program" , "$12.5" 等都是合法的字符串。

字符串和字符不同,它们之间主要有以下区别:

  • 字符由单引号括起来,字符串由双引号括起来。
  • 字符只能是单个字符,字符串则可以含一个或多个字符。
  • 可以把一个字符型数据赋予一个字符变量,但不能把一个字符串赋予一个字符变量。
  • 字符占一个字节的内存空间。字符串占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"\0" (ASCII码为0)。这是字符串结束的标志。

实型数据

实型数据类型指的就是浮点数或实数

实型数据类型的分类

类型说明符 比特数(字节数) 有效数字 数的范围
float 32(4) 6~7 -10^38~10^38
double 64(8) 15~16 -10^308~10^308

由以上内容可以看出:

  • 实型数据没有办法精确的表示所有数字,因此表示的范围大
  • 相邻两个数据的距离是不等距的
  • 每一种实型数据都有自己的有效位数和精度

实型数据的表示

  1. 十进制数形式:由数码0~9小数点组成。 例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230 等均为合法的实数。注意,必须有小数点。
  2. 指数形式:由十进制数,加阶码标志"e""E"以及阶码(只能为整数,可以带符号)组成。其一般形式为:a E n(a为十进制数,n为十进制整数) 其值为 a*10^n。如:2.1E5 (等于2.1*10^5) 3.7E-2 (等于3.7*10^-2)

实型数据在内存中的表示

前面的符号位很容易判断为0或者是1,指数部分称之为阶码,这个阶码部分是由偏置值(127或1111111)和阶码真值相加得到的,阶码真值符合IEEE-754标准,这个标准规定了是这个数一定能写成1.--*2的多少次方的形式,尾数部分的存储是原码的存储

常量和字面值

常量

常量 说明
直接常量(字面量) 可以立即拿来用,无需任何说明的量。
符号常量 用标识符代表一个常量。#define 标识符 常量
const常量 const int x=3.14;

字面值

  • 整型常量的类型:一般默认整型常量为int型。也可以根据其值所在范围或后缀确定其数据类型
长整型字面值         123L    23l

无符号整型字面值     123U    123u

无符号长整型字面值   123UL   123ul

long long型字面值   123ll    123LL
  • 浮点型字面值:默认为double型,也可以使用后缀f,F,l,L确定类型。

求字符串的长度

字符串字面值是由一对双引号括起来的字符序列(以'\0'结束)。

  1. 字符串字面值会自动在字符串最后加上'\0',占据一个字节的内存。
  2. 求字符串长度的时候注意转义字符占据一个字节,例如:'\xdd'等。