unit2 基本数据类型 and 相关计算
注:本文参考中国铁道出版社《C语言程序设计(第三版)》书写
主要用于记录学习中的重点要点,欢迎指出错误
同时也欢迎交流学习~
2.1 基本数据类型
三种:整数 浮点数 and 字符
有穷性
2.1.1 整形数据
不带小数点 and 指数符号 的数据
长度修饰:short , long
符号类型修饰:signed , unsigned
其中signed为int的默认类型,可以省略
short int 可以省略为 short
long , unsigned 同理
负数的表示方式,补码,用二进制的最高位的表示正负
整常量的类型表示方式:
加 L or l 表长整型常量
加 U or u 表无符号整数
在整数之后加上 U and L(顺序不限), 表无符号长整型
2.1.2 浮点型数据
表带 小数点 or 指数符号 的数值数据
三类:
单精度型 float
双精度型 double
长双精度型 long double
(实际上也存在long long double)
一般格式:
正负号 整数部分.小数部分 指数部分
注意点:
- 整数部分 and 小数部分 至少存在一个
- 小数点 and 指数部分 至少存在一个
- 指数部分格式
e(or E)整数
整数不可以少!!!
合法举例:
7. .457 1E5 1.5e-6
不合法举例:
E4 .E5 4.0E
也可以在常数结尾加上类型字符:
F 单精度
L 长双精度
默认为 双精度
此外还需要注意:
浮点数运算 和 数学中的小数运算 因为表示浮点数位数的限制是不一样的!!!
浮点数运算需要考虑到有效位数的问题
2.1.3 字符型数据
比较简单
注意点:
- 单个字符记得加
''
值得注意的是,转义字符常量也是一个字符
转义字符的拓展用法:\ddd
中ddd
表1~3个八进制数字,表示对应字符的ASCII值;同理\xhh
中hh
表1~2个十六进制数字 - 字符串记得加
""
值得注意的是,为单个字符赋值不要用""
否则就算其中只有一个字符也是字符串,结尾要多一个空白字符
2.2 基本 输入 and 输出
-
单个字符的输入and输出 putchar() and getchar()
putchar()输出其实参所代表的字符
可以直接简单来说存在一个 int 向 char 的隐式转换
而getchar()不需要实参 -
格式输出
printf()
printf()转换说明:
%
后 输出修饰符 and 输出格式符 ,输出修饰符可缺省完全格式如下:参考
%[flags][width][.precision][length]specifier
specifier 含义 d or i 十进制输出整数 o(必须是小写,其他未指明可以大写的都同理) (不带0开头)八进制输出整数 x or X (不带0x开头)十六进制输出整数 u 无符号十进制输出整数 f 小数形式输出单、双精度浮点数 e or E 指数形式输出单、双精度浮点数 c 输出一个字符 s 输出字符串 % 输出% p 十六进制输出指针所指向的地址 flags 含义 - 给定width内左对齐(默认右对齐) + 强制结果前显示正负号(默认省略+) # 搭配 o、x、X 非零值前显示 0、0x、0X ;搭配 e、E、f 强制输出含小数点 0 左侧补足空格都换成0 width 含义 (number) 输出不超过此长度则用空格补足,若超出则正常输出(不会截断) * 可以写这个,但没看懂,也一般用不到 .precision 含义 .number 一般用于浮点数,表示小数精确位数,取四舍五入;不过也可以用于整数等 .* 总之可以这样写 length 含义 h 短整型或无符号短整型(适用于i,d,o,u,x,X) l 长整型或无符号长整型(除适用于整型外,还适用于c and s用于表示宽字符) L 参数解释为长双精度型(仅适用于浮点说明符) 此外,鲜为人知的是,
printf()
也有返回值,成功输出时返回输出的字符总数,否则返回一个负值 -
格式化输入
scanf()
参数类型基本上是类似于printf()
的
值得注意的是对格式化输入的理解,可以理解为会按照设定的格式提取输入中的数据
此外还要注意,后续参数是要存储输入的数据的地址(在指针一章中详细叙述)
2.3 数据运算
2.3.1 赋值运算
- 简单赋值运算
变量=表达式
执行过程:- 右端表达式的运算
- 隐式类型转换,将表达式的类型自动转化为变量的类型
- 传值,将表达式的值存储到由变量所占的存储单元中
简单来说,是从右往左的运算顺序
- 复合赋值运算
+=
-=
*=
/=
%=
<<=
>>=
&=
^=
|=
总的来说就是用于简写的
2.3.2 算术运算
- 一般算术运算
按照操作数的个数 一个 or 两个, 分成 单目运算符 and 双目运算符
单目运算符:+
(取正)-
(取负)
双目运算符:+
-
*
/
%
双目运算符结合性是从左到右,单目运算符从右向左结合,优先级是单目更高 - 自增、自减运算
也可以说是增1和减1运算
分别是++
与--
对象只能是整型变量或者指针变量
可以在其之前,也可以在其之后,对变量本身而言都是类似的
2.3.3 关系运算 and 逻辑运算
- 关系运算
<
>
<=
>=
==
!=
以上运算符都是对于两者数的比较,条件满足的结果为1,否则为0
注意:- 前四者的优先级高于后两者
- 关系运算符的优先级低于算术运算符的优先级
- 关系运算符的结合性是自左向右的
- 逻辑运算
&&
(逻辑与)||
(逻辑或)!
(逻辑非)
注意:- 前两者是双目运算符,最后一个是单目运算符
- 两者都真,与为真;两者不都假或为真;真非假,假非真;
- 优先级:
!
最高,&&
其次,||
最低;此外,&&
||
低于关系运算符;!
则高于算术运算符 - 值得注意的性质:前两者判断顺序都是从左到右,此时需要注意
a && b
在a
为0之后就不会再判断b
了;
同理
a || b
在a
为1之后就不会再判断b
了;
2.3.4 条件运算
条件运算是C语言中唯一一个三目运算,运算符号?:
需要三个操作数
一般形式:
表达式1?表达式2:表达式3
执行过程:
- 运算表达式1
- 表达式1的值非0,计算表达式2,返回其运算的结果(不再执行3)
- 表达式1的值为0,则换成3
此外,三者数据类型可以各不相同,后两者类型低的向类型搞得转换
2.3.5 其他运算
此处做简单介绍
主要介绍:逗号运算、sizeof运算、位运算 和 移位运算
- 逗号运算
用,
将若干个表达式连接,构成一个逗号表达式
一般形式:
表达式1,表达式2,…,表达式n
执行过程:- 从左到右以此计算
- 将最后一个表达式的值作为整个表达式运算的结果
e.g.
x = ( i = 3 , i * 2 ) ;
运算后得i
为3,x
为6
- sizeof运算
用于返回 对象 or 某种类型 在内存中占据的字节数
一般形式:
sizeof(类型名)
orsizeof 表达式
- 位运算
- 移位运算
2.4 表达式
2.4.1 表达式分类
以表达式中优先级别最低的运算符来称呼
主要有以下6种:
- 算数表达式
- 关系表达式
- 逻辑表达式
- 赋值表达式
- 条件表达式
- 逗号表达式
注意点:
- 表达式中连续出现连个运算符,最好增加空格符,以避免二义性
- 表达式中,可以通过加圆括号强制改变运算顺序
- 优先级可以说明表达式的计算顺序,高的先运算,相同时由结合性决定计算顺序
- 结合性同样用来说明表达式的计算顺序,主要有两类:大多数自左向右;单目运算符、三目运算符、赋值运算符的结合性自右向左
2.4.2 表达式的类型转换
- 隐式类型转换
表达式中一般要求参与运算的两个操作数的类型一致
当不一致时,系统会自动将 低类型操作数 转换成另一个 高类型操作数 的类型,再进行运算
规则如下:
short char -> int -> unsigned int -> long -> unsigned long -> float -> double -> long double
进一步说明:- 运算时int类型最低,long double类型最高
- short and char型必须先转为int型才能参与运算
- 除去2)中两个类型,其余同类型均可直接计算
- 强制类型转换
强制类型转换至将一种表达式的数据类型强制性转换为另一种
一般格式:
(类型名)表达式
or类型名 (表达式)
后者为C++新增用法
注意:- 浮点型转整形,注意是直接向下取整,而非四舍五入
- 当强制转表达式并非单独的变量or常量时,记得加上括号以表示为一个整体