C/C++ 第二讲 数据类型、运算符和表达式
2.1 数据类型
变量
先定义再使用;先赋值再计算
int a, b, c ;
初始化:定义同时赋值
数据类型 变量名=表达式;
int k=3, m=3, n(3);
- 不能连写(int k=m=n=3),需逐个进行初始化。
数据类型 变量名(表达式);
(C++)
常量
种类:
- 值常量
- 5、3.14
- ‘a’ 字符常量
- “abcd” 字符串常量
- 符号常量
- 定义方式:
const 数据类型 标识符 = 常量;
const double PI = 3.14;
#define 标识符 常量值
#define N 100
- 注意用
define
时名与值之间用空隔分开;末尾不带分号。
值常量再分:
整型常量
- 十进制
- 以
1~9
开始,由0~9
组成 - 八进制
- 以数字0开始,由
0~7
组成 - 十六进制
- 以0x或0X开始,由
0~9
及A~F
组成
实型常量
- 十进制小数形式
- 指数形式
- 由尾数、指数符号(e或E)、指数构成
- 如
1.25e-5
- 如
- 要求:
- e前尾数不能省,e后指数必须为整数
- 指数不能加圆括号
符号常量再分:
- 普通字符常量
- 单引号引起来的单个字符,可在屏幕上直接显示
- 转义字符常量
- 以
\
开头用单引号括起的**字符序列**,如'\n'
(换行符),'\t'
(横向制表符),'\0'
(字符串结束)
- 以
- 字符串常量
- 用双引号括起的字符序列,系统在该常量尾自动加字符串结束符
'\0'
- 用双引号括起的字符序列,系统在该常量尾自动加字符串结束符
说明:
- 字符型数据在系统内存以ASCII码存储
- ‘A’-65, ‘a’-97, ‘0’-48
- 大小写互换
char ch = ch+'A'-'a'
(小变大)- 一定范围内的整型与字符型数据可相互转换
- char ch = ‘a’ - 32
- char x; x=rand()%26+65;
- ‘\0’与’0’不同,前者是字符串结束符,ASCII码0;后者是数字字符,ASCII码48.
- 字符常量‘a’与字符串常量”a”不同,前者占1个字节,后者占2个字节,末尾隐含’\0’
- “abcd”长度4,占字节5(\0)
similarly:
若输入字符串“ABC”,下面程序段的输出为(C)。
1 | char c; |
A.222 B.CDE C.676869 D.333
标识符 考点
标识符:
由字母、数字和下划线三种字符组成,且必须以字母或下划线开头。
关键字不能作为用户定义的标识符。
用户定义标识符:
合法: char2
_abc
a3
P1
不合法: int
p[i]
break
3a
a+b
class
public
常量:
合法: '\n'
'\102 '
'\t '
'\72'
不合法: ‘ABC’
(不是单引号引起来的单个字符) 1.2e0.5
(指数必须为整数) M
'[]'
2.2 运算符和表达式的基本概念
运算符
基本概念
- 优先级(15)
- 结合性(优先级相同时的运算符连续运算顺序)
- 自左向右
- 自右向左
- 目数(运算符所需操作数,通常目数少优先级高)
- 单目
- 双目(+-*/)
- 三目
常用运算符种类
相同目数的各运算符优先顺序:
算术>关系>逻辑>条件(三目)>赋值(双目)>逗号
表达式
概念
常量、变量、函数调用、运算符构成
要点
- 与数学表达式的区别
(a-b*c)/(x-y*z)
乘号不能省- 只能加圆括号
2.3 算术运算符
算术运算种类:
+ - * /(整除) %(求余) ++ --(自增、自减)
优先级:
++``--``+``-
(取正、负)*``/``%
+``-
整数相除:
- 两个操作数都是整数时,商也为整数,小数部分舍去。
- 如果要求精确结果,需将其中一个变为实数,如:
a*1.0/b
求余运算(%):
两操作数必须皆为整型
结果的符号与被除数一致
- a%b = a - a/b*b
应用:
判断
自增、自减运算符(++、–):
只能作用于(整型)变量;
前置或后置运算 (a++;–a)
- 前置、后置区别:
- 对自增、自减变量本身值无区别;
- 对参与的表达式贡献不同
- 前置运算以变化后的值参与运算
- 后置运算以原值参与运算
典例:
假设有: a=0,b=6,c=7,则表达式 a++&&b++&&c++运算完成后,整个表达式的值为 false( 0), a 的值为 1, b 和 c 保持原值不变。
这是因为“ a++” 作为后置自增运算, 以原值 0 参与“ &&”运算,使得整个表达式的值为 0,后续的“ b++” 和“ c++”没有被执行。
--a&&++b;
和++a--b;
也是同理。
2.4 关系运算符和逻辑运算符
关系运算符
“判断关系”
种类:
==(等于)、!=(不等于)
<(小于)、<=(小于等于)、>(大于)、>=(大于等于)
- 运算结果为“真”(1)和“假”(0)
关系运算符的优先级低于算术运算符,共有 6 种,分别为:
优先级为 6 的:>(大于) >=(大于等于) <(小于) <=(小于等于)
优先级为 7 的:==(等于) !=(不等于)
逻辑运算符
- 逻辑非(!)
- 逻辑与(&&)(取交集)
- 逻辑或()(取并集)
说明:
- 运算数可为任意类型,如关系表达式;
- 所有非0数均做“真”处理(当作1)
如:x>=0 && x<=100
- 只要可唯一确定值,逻辑运算即不再进行
--a&&b++&&c--
只会做–a,已经为0,可唯一确定运算值为0
2.5 赋值运算符、条件运算符、逗号运算符
赋值运算符
种类:
简单赋值运算符(=):
- 将右边表达式的值送入左边变量
复合赋值运算符:
- 将左边变量与右边表达式的值的和(差、积、商、余数)送入左边变量
- +=、-=、*=、/=、%=、……
特点:
- 左端只能为变量或数组元素,不能为表达式或常量。
- 反例:
a=b+2=c+5
- 反例:
- 两端类型不同时系统自动将右端类型转换为左端类型。
- 例:
int a=3.78
,则a=3 - 结合性自右向左
a=(b=(c=1)))
- 例:
条件运算符(? :)
形式:
e1? e2: e3
e1, e2, e3代表三个表达式
执行过程:
e1的值若非0,结果取e2;
e1的值若为0,结果取e3。
例1:
max = (x>y) ? x:y
例2:n人分班,每班k人
numclass = (n%k==0)? n/k: n/k+1
逗号运算符(,)
形式:
e1, e2, e3
e1, e2, e3代表三个表达式
执行过程:
从左向右依次计算每个表达式的值;整个表达式的值为最右边表达式的值。
例:
c=(a=10, b=20, a+b)
,则c=30
应用:
for语句中,用于连接多个表达式
for(i=0, j=n; i<j; i++, j--)
2.6 类型转换运算
自动类型转换
- 允许值从一种类型转换为另一种类型
- 赋值运算右端类型转换为左端类型
- 其他运算从低到高转换成同一种类型后再运算
- char(字符型), short(短整型)–>int(整型)–>unsigned(无符号整型)–>long(长整型)–>float(单精度实型)–>double(双精度实型)
- 其中char–>int, float–>double是必然的
1 | char c1, int k; |
强制类型转换
形式
(类型标识符) 表达式
或类型标识符 (表达式)
说明
得到一个新类型的数据,但原变量类型不变。
例1:
in i; float d=3.5; i=(int)d
则i=4, d=3.5
例2:将三位小数x四舍五入到百分位
x = (int)(x*100+0.5)/100.0
100.0:得到小数部分
- 强制类型转换符是单目运算符,优先级高于所有双目运算符:
1 | float a=3.5, b=2; |
2.7 指针
2.8 typedef语句
2.9 应用
setw()
用于斜输出,需要#include <iomanip>
1 | setfill("*") //设置填充字符 |
eg.输出三位整数的正负号、百位数、十位数、个位数
1 |
|