变量:
在程序中存储数据项的地方(用序列号指定内存地址)是可以变化的,所以叫做变量(variable)
名词:字节 字长 内存地址 类型名称 内存空间 存储的取值范围
2.1 计算机的内存
- 计算机执行程序时,组成程序的指令和程序所操作的数据都必须存储到主内存
- 在计算机中,所有的数值都存储为二进制数
- 内存中的位以8个为一组,每组的8位称为一个字节,每个字节的地址都是唯一的
内存的最小单位是位(bit),将8个位组合为一组,称为字节(byte)
内存的最小单位是位,将8个位组成一组,称为字节(byte),每个字节用一个数字表示,第一个字节用0表示,第二个字节用1表示,直到计算机内存的最后一个字节。字节的标记称为字节的地址(address),每个字节的地址都是唯一的。字节的地址唯一表示计算机内存的字节。
计算机内存的常用单位是千字节(KB)、兆字节(MB)、千兆字节(GB),大型磁盘驱动器使用兆兆字节(TB)
运算符的数据类型应该为char 类型
2.2 什么是变量
变量是计算机里一块特定的内存,变量是由一个或多个连续的字节所组成。
每个变量都有一个名称,可以用该名称表示内存的这个位置,以提取它包含的数据或存储的一个新数值。变量的使用次数是不受限制
计算机中,所有的值都存储为二进制数
每个变量都有类型来指定变量可以存储的数据种类
变量的命名
- 变量名只能包含字母、下划线和数字,且以字母开头,
(1)变量名中不能有空格,
(2)变量名是区分大小写的
(3)变量名不能以数字开头。
(4)不要将下划线用作第一个字符
遵循C语言标准的编辑器至少支持31个字符,只要不超过这个长度就没问题
- 问题:为什么生成不了表格(原因出现在那里生成不了表格)
2.3 存储整数的变量
int salary
变量声明语句声明了变量的名称。变量名
(1)变量声明语句以分号结束。
(2)变量声明语句也指定了变量存储的数据类型。
(3)变量声明也称为变量的定义,因为它分配了一些存储空间,来存储整数值,该整数可以用变量名salary来引用。
- 注意:声明引入了一个变量名,定义则给变量分配存储空间,
printf("My salary is %d.", salary);
括号内有两个参数,用逗号分开,参数是传递给函数的值,在这个程序语句中,传给printf()函数的两个参数如下:
- 参数1 是一个控制字符串,用来控制其后的参数输出以什么方式显示,它是放在双引号内的字符串,也称为格式字符串,因为他指定了输出数据的格式。
- 参数2是变量名salary,这个变量值的显示方式是由第一个参数----控制字符串来确定的。
转换说明符总是以%字符开头,字符串中的%d,称为变量值的转换说明符。
转换说明符确定变量在屏幕上的显示方式
int brothers, brides;
- 在一个语句中声明多个变量时,必须用逗号将数据类型后面的变量名分开,该语句要用分号结束,分号决定语句的结束,而不是代码行的结束。
- 变量在其声明之前在代码中是不存在的,必须总是在使用变量之前声明它。
2.3.1 变量的使用
- 位于一对大括号之间的一组语句有相同的缩进量
- 语句:
赋值语句 :给变量指定特定的值
算术语句 :把每个变量的值加在一起
” = “ 赋值运算符 - 变量名由多个单词组成,则单词间用“ _ ” 连接 total_pets
2.3.2 变量的初始化
1 、基本的算术运算
在C语言中,算术语句的格式如下:
变量名 = 算术表达式;
- 变量名也是一个表达式(什么是表达式)
- 不能在字符串的中间放置换行符
- 字符串在显示之前会先换行,因为开头处有一个\n
在C语言中,赋值运算符的符号“ = ” 定义了一个动作。它将右边表达式中的结果存到左边的变量中。
- 表达式:
注意:
在赋值运算中,先计算等号右边的表达式,然后将结果存到等号左边的变量中,新的值取代赋值运算符左边的变量中的原值。
- 计算结果是数值的表达式称为算术表达式。
- 应用运算符的值(数据项)一般称为操作数。需要两个操作数的运算符称为二元运算符,应用于一个值得运算符称为一元运算符。
- 两边的操作数都是整数时,所有这些运算符都生成整数结果,,取模运算符左边的表达式值去除运算符右边的表达式的值,并求出其余数,余数运算符。(取模运算符是求得余数的)
一个正整数对除数10取模可以得到的余数是正整数的最右边的一位。
一个正整数对除数10求商
- 基本的算术运算符
运算符 | 动作 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取模(Modulus |
2.4 变量与内存
2.4.1 带符号的整数类型
整数变量类型名称
类型名称 | 字节数 |
---|---|
signed char | 1 |
short int 短整型 | 2 |
int 整型 | 4 |
long int 长整形 | 4 |
long long int | 8 |
2.4.2 无符号的整数类型
无符号整数类型名称
类型名称 | 字节数 |
---|---|
unsigned char | 1 |
unsigned short int | 2 |
unsigned int | 4 |
unsigned long int | 4 |
unsigned long | 4 |
unsigned loog long int | 8 |
2.4.3 指定整数常量
- 注意
小写字母l和数字1有很大的区别
(1)负整数常量的定义要用负号
(2)将整数常量指定为 long long 类型时,应添加两个LL
(3)将常量指定为无符号类型时,应添加U
(4)初始值的类型是 unsigned long long 时应添加ULL
1 十六进制常量
2 八进制常量
3 默认
2.5 使用浮点数
浮点数的表示方法
数值 | 使用指数表示法 | 在语言中也可以的 |
---|---|---|
1.6 | 0.16✖️10 | 0.16E1 |
0.0000008 | 0.8 ✖️10的· | 0.8E-4 |
7655.899 | 0.7655899 | 0.7655899E4 |
100.0 | 1.0 | 1.0 E2 |
2.6浮点数变量
- 浮点数变量类型
关键字 | 字节数 | 数值范围 |
---|---|---|
float | 4 | 精确到6到7位小数 |
double | 8 | 精确到15位小数 |
long double | 12 | 精确到18位小数 |
- 任何数,只要有小数点,就是double类型
使用E或e 指定指数值时,这个常量就不需要包含小数点
2.6.1使用浮点数完成除法运算
- 使用浮点数进行除法运算,会得到正确的结果---至少是一个精确到固定位数的值。
- 格式说明符一般必须对应输出的值的类型
2.6.2控制输出中的小数位数
- 可以用格式说明符指定小数点后面的位数
2.6.3控制输出的字段宽度
- 输出的字段宽度是输出值所使用的总字符所使用的总字符数(包括空格);
- 用于浮点数的格式说明符的一般形式
% [width] [.precision] [modifier] f
width的值是一个整数:指定输出的总字符即字段宽度
precision 的值是整数:指定小数点后的位数
当输出值的类型是long double时,modifier部分就是L,否则就省略它。
如果希望数值左对齐,只需要在%的后面添加一个负号
读取数据的格式说明符
- %s说明符用于输出一个用空字符终止的字符串
- %d说明读取的值得类型是整数 int
- %ld说明读取的值的类型是 long int
- %u
%lf说明读取的值得类型是double
%f说明读取的值的类型是浮点数 float
%.2f这个格式说明符指定输出的值在小数点后面有两位小数
使用格式说明符%f显示浮点数,对应输出的值的类型
格式说明符%d显示整数
- %c转换说明符将变量的内容解释为单字符
- 使用%u显示sizeof生成的值
- 使用新的格式说明符%p来输出变量的地址(内存地址)
读取数据的格式说明符//
操作 | 需要的控制字符串 |
---|---|
读取short类型的数值 | %hd |
读取int类型的数值 | %d |
读取long 类型的数值 | %ld |
读取float类型的数值 | %f或%e |
读取double类型的数值 | %lf或le |
- 分号决定语句的结束,而不是代码行的结束,一般在一个语句中定义一个变量,变量在其声明之前在代码中是不存在的,必须总是在使用变量之前声明
- 在变量名前加上const关键字,可以固化变量的值
2.7较复杂的表达式
在scanf()函数的控制符串后面有多少个参数,控制字符串就有多少个格式说明符
2.8定义命名常量
-
define语句中的标识符都是大写
2.8.1极限值
- 整数类型的极限值的符号
类型 | 下限 | 上限 |
---|---|---|
char | CHAR_MIN | CHAR_MAX |
short | SHORT_MIN | SHORT_MAX |
int | INT_MIN | INT_MAX |
long | LONG_MIN | LONG_MAX |
long long | LLONG_MIN | LLONG_MAX |
- 浮点数类型的极限值的符号
类型 | 下限 | 上限 |
---|---|---|
float | FLT_MIN | FLT_MAX |
double | DBL_MIN | DBL_MAX |
long double | LDBL_MIN | LDBL+MAX |
2.8.2 sizeof运算符
size_t类型在标准头文件
使用size_t变量存储sizeof运算符生成的值
表达式sizeof(int)会得到int类型的变量所占用的字节数,所得到的值是一个size_t类型的整数
2.9 选择正确的类型
程序错误的原因是什么?
问题的原因
问题的解决办法
- 需要考虑
- 需要记住数据类型的字节数和值域
如何判断是把double类型的转化为long 类型呢?
- 因为double类型的值域比Long类型的值域大。
long 类型与float类型又是如何转化的呢?
- long
int类型的值域小于float类型时,自动将Int类型的值转化为float类型。
RevQuarter = QuarterSold/150*Revenue_Per_150
乘除的优先级相同。
RevQuarter = Revenue_Per_150*QuarterSold/ 150
因为对混合的操作数执行算术运算时,编译器会自动把整数操作转换为浮点数
2.10强制类型转换
RevQuarter = QuarterSold / 150*Revenue_Per_150
要把变量从一种类型转换为另一种类型,应把目标类型放在变量前面的括号
RevQuarter = (float) QuarterSold / 150*Revenue_Per_150
一种类型显示转换为另一种类型的过程称为强制类型转换(cast)
把表达式的结果从一种类型强制转换为另一种类型时。此时,应将表达式放在括号中,如下例子:
double result = 0.0;
int a = 5;
int b = 8;
result = (double)(a+b)/2 - (a +b)/double(a*a + b*b);
2.10.1
- 在二元算术运算中使用不同类型的操作数,编译器就会把其中一个值域较小的操作数类型转换为另一个操作数的类型,这称为隐式类型转换(implicit conversion).
- 当二元运算符处理不同的类型的的操作时,总会进行隐式类型转换。
2.10.2 隐式类型转换的规则
基本规则:
将值域较小的操作数类型转换为另一个操作数类型
(1)如果一个操作数的类型的是Long double,就把另一个操作数转换为long double类型。
(2)否则,如果一个操作数的类型是double,就把另一个操作数转换为double类型。
(3)否则,如果一个操作数的类型是float,就把另一个操作数转换为float类型。
(4)否则,如果两个操作数的类型都是带符号的整数或无符号的整数,就把级别较低的操作数转换为另一个操作数的类型。无符号整数类型的级别从低级从低到高为:
signed char, short, int , long , long long
(5)否则,如果带符号整数类型的操作数级别低于无符号整数类型的级别,就把带符号整数类型的操作数转换为无符号整数类型。
(6)否则,如果带符号整数类型的值域包含了无符号的整数类型所表示的值,就把无符号整数类型转换为带符号整数类型。
(7)否则,两个操作数都转换为带符号整数类型对应的无符号整数类型。
2.10.3 赋值语句中的隐式类型转换
赋值运算符右边的表达式与其左边的变量有不同的类型时,也可以进行隐式类型转换。
int number = 0;
float value = 2.5f;
number = value;
当需要在代码中进行可能导致丢失信息的类型的转换时,最好使用显示类型转换
赋值操作中的类型转换规则,
double price =10.0;
long count = 5L;
float ship_cost = 2.5F;
float discount = 15;
long double total_cost = (count*price + ship_cost)*((100L -discount)/100.0F);
当操作数的类型不同时,赋值操作总是要把右操作数的结果转换为左操作数的类型,
double类型的所有值都可以表示为long double类型。
2.11再谈数值数据类型
char类型的变量可以存储单个字符的代码,char只能存储一个字符代码,所以被看做整数类型。
2.11.1 字符类型
可以给char类型的变量指定字符常量,作为其初始值。
char letter =' A';
char digit =' 9';
char exclamation ='! '
也可以使用转义序列指定字符常量
char newline = '\n';
char tab = '\t';
char single_quote = ' \'';
还可以使用整数值初始化char类型的变量,
char charcater = 74;
char类型的变量有双重性:可以把他解释为一个整数,也可以把它解释为一个字符
char letter = ' c ' ;
letter = letter +3 ;
注意:
无论char类型实现为带符号还是不带符号的类型,char 、signed char、和unsigned char 类型都是不同的,需要进行转换。
2.11.2 字符的输入输出
使用scanf函数和格式说明符%c,可以从键盘上读取单个字符,将它存储在char类型的变量中,
char ch = 0;
scanf("%c", &ch);
在printf()函数语句中使用格式说明符将单个字符输出到命令行上m
printf("The character is %c\n", ch );
当然也可以使用该字符的值
printf("The character is %c and the code value is %d\n",ch ,ch);
2.11.3 枚举
enum Weekday {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
这个语句定义了一个类型,而不是变量,
类型名称称为枚举的标记类型的
变量值可以是类型名称后面大括号中的名称指定的任意值,这些名称称为枚举器或枚举常量。
每个枚举器都用我们赋予的唯一名称来指定,
枚举是一个整数类型
enum Weekday today = Wednesday;
这个语句声明了一个变量today,并初始化为Wednesday.由于枚举器有默认值,所以,Wednesday 对应于2.
定义枚举类型时,声明该类型变量
enum Weekday{Monday , Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}today, tomorrow;
在同一个语句中初始化变量,
enum Weekday{Monday, Tuesday, Wednesday, Thursday, Friday,Saturday,Sunday} today= Monday, tomorrow= Tuesday;
枚举类型的变量是整数类型
enum Weekday{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,Sunday} today = Monday, tomorrow = today + 1;
需要确保算术运算的结果是一个有效的枚举值。
1、选择枚举值
枚举器使用的名称必须是唯一的
enum Weekday {Monday = 1. Tuesday, Wednesday, Thursday, Friday, Saturday,Sunday}'
在明确指定了值得枚举器后面,枚举器会被赋予连续的整数值。
enum Weekday{Monday = 5, Tuesday =4, Wednesday, Thursday = 10, Friday= 3, Saturday, Sunday};
定义枚举
enum Suit{ clubs = 10, diamonds, hearts,spades};
enum Suit card_suit = diamonds;
定义一个扑克牌的面值的枚举类型
enum FaceValue { two= 2, three, four , five ,six ,seven,
eight,nine ,ten , jack,queen, king, ace};
2、未命名的枚举类型
enum { red, orange , yellow, green, blue, indigo , violet} short_color;
这个语句没有标记,因此定义了一个未命名的枚举类型,该语句还声明了未命名的变量shirt_color.
必须在定义该类型的语句中声明它的所有变量。
2.11.4 存储布尔值的变量
_BooL类型存储布尔值。
_Bool 类型的变量值可以是0或1,对应于布尔值的false,和true,由于值0和1是整数,所以_Bool类型的为整数类型。
声明布尔值
_Bool valid = 1;
#include
_Bool valid = 1;
2.12 赋值操作的op=形式
number = number + 10;
number += 10;
+= 运算符 是op= 运算符之一
op=中的op可以是任意算术运算符:
+ = - * / %
>> << & ^ |
lhs op= rhs;
rhs表示op=运算符右边的表达式
lhd = lhs op (rhs);
2.13 数学函数
math.h头文件包含各种数学函数的声明
所有的函数都返回一个double类型的值。
double x = 2.25;
double less = 0.0;
double more = 0.0;
double root = 0.0;
less = floor(x);
more = ceil(x);
root = sqrt(x);
double angle = 45.0;
double pi = 3.14159265;
double sine = 0.0;
double cosine = 0.0;
sine =sin(pi*angle/180.0);
cosine= sin(pi*angle/180.0);
注意:格式符的个数要与变量、常量或者表达式的个数一一对应
其格式为:printf("输出格式符",输出项)
C中提供的取模(%)是用来求两个整数相除的余数