【C primer plus 笔记】 第三章 数据和C

3.1 示例程序

//platinum.c -- your weight in platinum
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
int main(void)
{
    float weight;    //你的体重
    float value;    //相等重量的白金价值

    printf("Are you worth your weight in platinum?\n");
    printf("Let's check it out.\n");
    printf("Please enter your weight in pounds:");

    //获取用户的输入
    scanf("%f", &weight);
    //假设白金的价格是每盎司$1700
    //14.5833用于把英镑常衡盎司转换为金衡盎司
    value = 1700.0 * weight * 14.5833;
    printf("Your weight in platinum is worth $%.2f.\n", value);
    printf("You are easily worth that! If platinum prices drop,\n");
    printf("eat more to maintain your value.\n");

    return 0;
}
0
  如果输入程序时打错,编译器会报告语法错误消息,然而,及时输入正确无误,编译器也可能给出一些警告,错误消息表明程序中有错,不能进行编译,而警告则表明,尽管编写的代码有效,但可能不是程序员想要的,警告并不终止编译。
  代码中使用了一种新的变量声明,浮点数类型(float),可以处理更大范围的数据,float类型可以储存带小数的数字
  为了打印新类型的变量,在printf()中使用%f来处理浮点值。%.2f中的.2用于精确控制输出,指定输出的浮点数只显示小数点后面两位。
  scanf()函数用于读取键盘的输入。%f说明scanf()要读取用户从键盘输入的浮点数,&weight告诉scanf()把输入的值赋给名为weight的变量,scanf()函数使用&符号表明找到weight变量的地点。
  本程序最突出的新特点是它的交互性,计算机向用户询问信息,然后用户输入数字。交互式使得程序更加灵活。scanf()和printf()函数用于实现这种交互,scanf()函数读取用户从键盘输入的数据,并把数据传递给程序,printf()函数读取程序中的数据,并把数据显示在屏幕上,把两个函数结合起来,就可以建立人机双向通信。

3.2 变量与常量数据

  在程序的指导下,计算机可以做许多事情,要完成这些任务,程序需要使用数据,即承载信息的数字和字符,有些数据类型在程序使用之前已经预先设定好了,在整个程序运行过程中没有变化,这些称为常量。其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量。

3.3 数据:数据类型关键字

  不仅变量和常量不同,不同的数据类型之间也有差异,一些数据类型表示数字,一些数据类型表示字符。C通过识别一些基本的数据类型来区分和使用这些不同的数据类型。如果数据是常量,编译器一般通过用户书写的形式 来识别类型。但是,对变量而言,要在声明时指定其类型。

  在C语言中用int关键字表示基本的数据类型,后三个关键字和C90新增的signed用于提供基本整数类型的变式。char关键字用于指定字母和其他字符。另外char类型也可以表示较小的整数。float 、double和long double 表示带小数点的数。_Bool类型表示布尔值(true或false),_complex和_Imaginary分别表示复数和虚数。

  通过这些关键字创建的类型,按计算机的存储方式可分为两大基本类型:整数类型和浮点数类型
  1字节=8位。最小的存储范围是位,是计算机内存的基本模块,可以存储0或1(或者说用于设置“开”或者“关”),8位字节有256种可能的0、1组合。
  字是设计计算机时给定的自然存储范围,计算机的字长越大,其数据转移越快,允许的内存访问也更多。现在有32位,64位
  和数学的概念一样,C语言中,整数是没有小数部分的数,计算机以二进制数字存储整数。
  浮点数与数学中的实数的概念差不多。在一个值后面加上一个小数点,该值就成为一个浮点值。书写浮点数有多种形式。
  计算机把浮点数分成小数部分和指数部分来表示,而且分开存储这两部分,当然,计算机在内部使用二进制和2的幂进行储存。
  整数没有小数部分,浮点数有小数部分
  浮点数可以表示的范围比整数大。
  对于一些算术运算,浮点数损失的精读更多
  因为在任何区域内都存在无穷多个实数,所以计算机的浮点数不能表示区间内所有的值,浮点数通常只是实际值的近似值。
  浮点数运算比整数运算慢

3.4 C语言基本数据类型

  3.4.1 int类型

  C语言中的整数类型可表示不同的取值范围和正负值。一般情况使用int类型即可。
  int类型是有符号整型,即int类型的值必须是整数,可以是正整数、负整数或零。其取值范围依照计算机系统而异。ISO C规定int的取值范围最小为-32768~32768。一般而言,系统用一个特殊位的值表示有符号整数的正负号
  声明int变量:先写上int,然后写变量名,最后加上一个分号。要声明多个变量,可以单独声明每个变量,也可在int后面列出多个变量名,变量名之间用逗号分隔
  变量获得值的途径:第一种是赋值a=10;,第二种是听过函数(如,scanf())获得值,第三种是初始化变量,就是为变量赋一个初始值。
  在C语言中,初始化可以直接在声明中完成,只需在变量名后面加上赋值运算符(=)和待赋给变量的值即可。
  简而言之,声明为变量创建和标记存储空间,并为其指定初始值。
  C语言把不含小数点和指数的数作为整数。C语言把大多数整形常量视为int类型,但是非常大的整数除外。
  可以使用printf()函数打印int类型的值,%d指明了在一行中打印整数的位置,%d称为转换说明,他指定了printf()应使用什么格式来显示一个值。格式化字符中的每个%d都与待打印变量列表中相应的int值匹配。这个值可以是int类型的变量、int类型的常量或其他任何值为int类型的表达式。作为程序员,要确保转换说明的数量与待打印值的数量相同,编译器不会捕获这类型的错误。
  在C语言中,用特定的前缀表示使用哪种进制,0x或0X前缀表示十六进制,0前缀表示八进制。
  在C语言中可以使用和显示不同进制的数,不同的进制要使用不同的转换说明。十进制使用%d,八进制使用%o,十六进制使用%x,另外,要显示各进制数的前缀0,0x,必须分别使用%#o、%#x,%#X

  3.4.2 其他整数类型

  C语言提供了3个附属关键字修饰基本整数类型:short、long、unsigned。
  short int(或者简写为short)占用的存储空间可能比int类型少,常用于较小数值的场合以节省空间。
  long int或long占用的存储空间可能比int多,适用于较大数值的场合。
  long long int或long long占用的储存空间可能比long多,适用于更大数值的场合
  unsigned int或unsigned只用于非负值的场合。这种类型与有符号类型表示的范围不同。用于表示正负号的位现在用于表示另一个二进制位,所以无符号整形可以表示更大的数
  整数范围溢出:可以把整数看作是里程表,当达到它能表示的最大值时,会重新从起始点开始。注意,溢出范围时,系统并未通知用户,因此,在编程时必须自己注意这类问题
  打印unsigned int类型的值,使用%u转换说明,打印long使用%ld,在x和o之前可以使用l前缀,short类型用%hd。l和h也都可以和u一起使用。

  3.4.3 使用字符:char类型

  char类型用于储存字符,但是从技术层面看,char是整数类型,因为char类型实际上储存的是整数而不是字符,计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。最常用的是ASCII编码。
  标准ASCII码的范围是0-127。只需要7位二进制数即可表示。通常char类型被定义为8位的存储单元,因此容纳标准ASCII码绰绰有余。一般而言,C语言会保证char类型足够大,以储存系统的基本字符集。
  C语言把1字节定义为char类型占用的位数,因此无论是16为还是32位系统,都可以使用char类型
  char类型变量的声明方式与其他类型变量的声明方式相同。
  如果要把一个字符常量初始化字母A,通过一下初始化把字母A赋给grade即可。
  char grade = ‘A’;
  在C语言中,用单引号括起来的单个字符被称为字符常量。编译器一发现‘A',就会将其转换成相应的代码值。单引号必不可少。
  如果省略单引号,编译器认为T是一个变量名;如果把T用双引号括起来,编译器认为“T”是一个字符串。
  实际上,字符是以数值形式储存的,所以也可使用数字代码值来赋值。但最好使用字符常量,而不是数字代码值。
  打印不出来的字符可以使用ASCII码或者转义序列。
  把转义序列赋给字符变量时,必须用单引号把转义序列括起来。

 

  无论是普通字符还是转义字符,只要是双引号括起来的字符集合,就无需用单引号括起来。双引号中的字符集合叫做字符串。
  转义序列可移植性高
  printf()函数用%c指明待打印的字符。printf()函数中的转换说明了决定数据的显示方式,而不是数据的存储方式。

  3.4.4 _Bool类型

  _Bool类型用于表示布尔值,即逻辑值true和false。

  3.4.5 可移植类型:stdint.h和inttypes.h

  C语言为现有类型创建了更多类型名,这些新的类型名定义在stdint.h头文件中。
  精确宽度整数类型:int32_t 表示整数类型的宽度正好是32位。但是,计算机的底层系统可能不支持。
  最小宽度类型:指所表示的类型一定是至少有指定宽度的最小整数类型。例如int_least8_t
  最快最小宽度类型:int_fast8_t类型定义为系统中对有符号值而言最快最小宽度类型。
  最大的有符号整数类型:intmax_t
  最大的无符号整数类型:unintmax_t

  3.4.6 float、double和long double

  浮点类型能表示包括小数在内更大范围的数。浮点数的表示类似于科学计数法。
  浮点型变量的声明和初始化方式与整形变量相同
  在代码中可以用多种形式书写浮点型常量。浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e或E,最后是一个有符号数表示10的倍数。
  正号可以省略,可以没有小数点或指数部分,但不能同事省略两者,可以省略小数部分或整数部分,但不能同事省略两者。
  不要在浮点型常量中间加空格。
  默认情况下,编译器假定浮点型常量是double类型的精度。在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型。使用L后缀使得数字成为long double类型。没有后缀的浮点型常量是double类型
  printf()函数使用%f转换说明打印十进制计数法的float和double类型浮点数,用%e打印指数计数法的浮点数。打印long double类型要使用%Lf、%Le转换说明。给那些未在函数原型中显示说明参数类型的函数传递参数时,编译器会把float类型的值自动转换成double类型。

  3.4.7 复数和虚数类型

  三种复数类型:float_Complex,double_Complex,long double_Complex
  三种虚数类型:float_Imaginary,double_Imaginary,long double_Imaginary
  如果包含complex.h头文件,可以用complex代替_Complex,用imaginary代替_Imaginary,还可以用I代替-1的平方根
  3.4.8 其他类型
  数组、指针、结构和联合

  3.4.9 类型大小

  sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小,%zd转换说明匹配sizeof的返回类型

 
 
posted @ 2023-05-22 22:10  永生辉皇  阅读(40)  评论(0编辑  收藏  举报