C语言学习日记一
一.数据和C
1.变量与常量数据
常量:事先设定好,在整个程序的运行过程中没有变化,例如:weight = 10,10就是常量。
变量:数据类型可以在程序运行过程中发生变化或者被赋值,例如:weight = 10,weight就是变量。
2.数据类型和关键字
数据类型关键字:
最初K&R给出的关键字 | C90标准添加的关键字 | C99标准添加的关键字 |
---|---|---|
int | signed | _Bool |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
因此我们可以分析出计算机存储时分为整数类型和浮点数类型
同数学一样,整数类型是没有小数的数,例如4,-3。 而像4.00,-3.00就是浮点数
浮点数可以是 2.75,8.6E9。也可以是2e-8这种
一般来讲浮点数通常只是实际值的近似值,而且浮点运算比整数运算慢,在这过程中损失的精度也越多
3.C语言的基本整数数据类型
- int类型,为有符号的整型,可以是正整数,也可以是负整数或零,取值范围在-32768~~32767之间,即2的15次方,最高位取0表示正数,取一表示负数,构成2的16位,不过现在一般而言是32位计算机,int就是32位,依次类推。
- short int类型(简写为short),占用的存储空间可能比int小,但不会比int多,用于较小数值的场合,也有符号。
- long int类型(简写为long),占用的存储空间可能比int多,但不会比int少,用于较大数值的场合,也有符号。
- long long int(简写为long long)占用的空间可能比long多,适用于数值较大的场合,该类型至少占64位,也有符号。
- unsigned int(可以简写为unsigned)用于非负值的场合,用于表示正负号的最高位用于取值,故可以表示更大的数,它也可以添加到上面的类型,如 unsigned short,unsigned long等。
signed 强调有符号类型的意图,如 short ,signed short,signed short int 都表示同一类型。
占用空间大小关系为short <= int <= long <= long long(64位)
注意事项
- 如果在long类型和int类型占用空间相同的机器上面编写代码,当确实需要32位的整数时,一般使用long类型,便于移植到16位机器上运行时任然可以正常运行,同理64位用longlong而不是long,向多取。
- 当有些情况下需要以long类型存储一个小数字时,通常在值的末位添加小写的l或大写的L,用大写更好,因为小写l更像1,例如7L,同理7LL表示以long long类型存储7,另外用字母u或U表示unsigned,10ULL,7LLU,10UL。当然也可以用于八进制和十六进制0x10ul(0x表示十六进制),020ULL(0表示八进制)
- int类型被认为是计算机处理整数数据最高效的类型
4.使用字符:char 类型
char 类型用于存储字符,通常被定义为8位的存储单元。从技术层面看,char 是整数类型,因为实际存储的是数字而非字符,最常用来表示ASCII (0~127位)。C语言把一字节定义为char类型占用的位(bit)数
声明char类型变量
char grade=‘A’;
char grade=“A”;//错误,此时的“A”是一个字符串
由于char实际上是以数值形式存储,所以也可以用数值来赋值,不过一般不建议这样char grade=65;
C语言将字符常量视为 int 类型而不是 char 类型,因此char = ‘ABCD’;时,在char为8位的ASCII码时,只有最后八位有效,即等同于char = ‘D’;
非打印字符 转义序列
转义序列 | 含义 |
---|---|
\a | 警报 Bell(speaker beeps) |
\b | 退格Backspace(non-erase) |
\f | 换页Form feed/clear screen |
\n | 换行New line |
\r | 回车Carriage Return |
\t | 水平制表符Table |
\v | 垂直制表符Vertical tab |
\\ | 反斜杠 |
\’ | 单引号 |
\" | 双引号 |
\? | 问号 |
\0oo | 八进制值(oo必须是有效的八进制数,即每个o都可以表示0~7中的一个数) |
\xhh | 十六进制值(hh必须是有效的十六进制数,即每个h都可以表示0~f中的一个数) |
\b、\f、\n、\r、\t 和 \v 是常用的输出设备控制字符,它们都会对活跃位置(显示设备中下一个字符即将出现的位置)产生影响。
\b 退格 (BS) ,将当前位置移到前一个字符,但不会删除后面的,但是有可能会被新内容覆盖
\f 换页 (FF),将当前位置移到下页开头
\n 换行 (LF) ,将当前位置移到下一行开头
\r 回车 (CR) ,将当前位置移到本行开头,但不会删除后面的,但是有可能会被新内容覆盖
\t 水平制表 (HT) (跳到下一个 TAB 位置)
5. _Bool类型
C99标准添加了_Bool 类型,用于表示布尔值,即逻辑值 true 和 false,值0表示false,值1表示true,_Bool 类型也是一种整数类型。但是它仅仅只占用1位存储空间
6.C语言的基本浮点数据类型
1. float
必须至少能够表示6位有效数字,而不是小数点后6位。取值范围为10e-37~10e37。通常系统存储一个浮点数要占用32位,其中八位表示指数的值和符号,其余24位表示非指数部分及其符号。
2.double
双精度 ,占用64位同 float 最小取值范围相同,但是至少必须表示10位有效数字,但是由于某些系统的缘故,double 类型的值至少表示13位有效数字。
3. long double
比 double 类型更高的精度要求
注意事项
-
正号可以省略。可以没有小数点(2E5)或指数部分(13.23)但不能同时省略,可以省略小数部分(4.E5)或整数部分(.4E-3)但也不能同时省略
举例有效浮点类型100.、 .4E-5、 4.e2、 .2 -
不能在浮点型常量中间加空格 默认情况下,编译器假定浮点型常量是 double 类型的精度 some = 4.0*2.0;//some是float型变量
4.0和2.0会被存储为64位的 double 类型,使用 双精度进行计算,然后将乘积切断成 float 类型的精度,虽然精度高,但是运行时间长。因此在浮点数后加f或F可以覆盖默认设置,加L可以变成 long double 类型。 -
当没有在函数原型中显示说明参数类型的函数(如printf())传递参数时,C编译器会把float类型的值转换成double类型的值
-
浮点数上溢时,用 printf() 显示该值为 inf
-
浮点数下溢时,会损失原有精度。有专门的函数计算是否会低于正常值
-
特殊的浮点值NaN(not a number),表示未定值
7.复数和虚数类型
C语言有3种复数类型 float_Complex、double_Complex 和 long double_Complex。例如float_Complex 中含有两个 float类型的值,分别表示复数的实部和虚部
类似地,C语言的三种虚数类型是 float_Imaginary、double_Imaginary 和 long double_Imaginary。
8.一些补充
- sizeof()函数可以用来查询当前系统的指定类型的大小,在printf()函数中用%zd打印。
例如printf("Type int has a size of %zd bytes.\n",sizeof(int));
- C编译器在把浮点数转换为整数时,会直接丢弃小数部分,而不是四舍五入。
- C标准明确规定了何时把缓冲区的内容发送到屏幕:当缓冲区满、遇到换行字符、或者需要输入时(printf()函数等)。