类型安全
早期语言强调类型, 面向底层的语言强调
类型
C 语言需要类型, 但是对类型的安全检查并不足够
数据类型
- 类型名称: int 、long 、double。
- 输入输出时的格式化: %d 、%ld 、%lf 。
- 所表达的数的范围: char < short < int < float < double。
- 内存中所占埠的大小:1 个字节到16 个字节 。
- 内存中的表达形式:二进制数( 补码)、编码。
sizeof
- 是静态运算符, 它的结果在编译时刻就决定
- 不要在sizeof 的括号里做运算, 这些运算不会做的
int a=6;
printf("sizeof(a)=%ld\n",sizeof(a++));
printf(""a=%d\n",a);
return 0;
输出结果
sizeof(a)=4
a=6
补码的意义:拿补码和原码可以加出一个溢出的“零”。
unsigned
- 如果一个字面量常数想要表达自己是unsigned, 可以 在后面加u或U
- 用l或L 表示long(long)
- unsigned 的初衷并非扩展数能表达的范围, 而是为了做纯二进制运算, 主要是为了移位。
整数的输入输出
只有两种形式: int 或long long
%d: int
%u: unsigned
%ld: long long
%lu: unsigned long long
%o: 输出八进制
%x: 输出十六进制 %X:输出大写的十六进制 0x1A
8进制和16进制只是如何把数字表达为字符串,与内部如何表达数字无关
浮点的输入输出
类型 | scanf | printf |
---|---|---|
float | %f | %f,%e |
double | %if | %f,%e |
%e科学计数法形式
输出精度
在% 和f 之间加上.n可以指定输出小数点后几位,这样的输出是做4舍5入的
printf("%.3f\n",-0.0049 );
超过范围的浮点数
- printf 输出inf 表示超过范围的浮点数: ±∞
- printf 输出nan 表示不存在的浮点数
- 带小数点的字面量是double而非float,float需要用f/F后缀表明身份。
f1==f2可能失败
fabs(f1-f2)<1e-12
- 浮点数判断相等时允许误差范围内来认定。
- 无特殊需要是浮点类型选double。
字符的输入输出
%c
scanf("%d %c",&a,&b)不等于scanf("%d%c",&a,&b)
当输完a值后,打空格则后者对于b的读取即为空格space(‘32’)
大小写转换
字母在ASCII表中是顺序排列的
大写字母和小写字母是分开排列的, 并不在一起
’ a ‘-‘A’ 可以得到两段之间的距离, 于是
a +’ a ‘-‘A’ 可以把一个大写字母变成小写字母, 而
a +’ A '-‘a’ 可以把一个小写字母变成大写字母
自动类型转换
- 当运算符的两边出现不一致的类型时, 会自动转换成较大的类型
- char 一 > short 一 > int 一> long 一> long long
int 一> float 一> double - 对于printf, 任何小于int 的类型会被转换成int ;float 会被转换成double
- 但是scanf 不会, 要输short , 需要%hd
强制类型转换
- 要把一个量强制转换成另一个类型( 通常是较小的类 型) , 需要: ( 类型) 值
- 只是从那个变量计算出了一个新的类型的值, 它并不改变那个变量, 无论是值 还是类型都不改变
- 强制类型转换优先级高于四则运算
bool
#include<stdbool.h>
逻辑运算
优先级:!>&&>||
短路
逻辑运算是自左向右进行的, 如果左边的结果已经能决定结果了, 就不会做右边的计算。
- 对于&& , 左边是false 时就不做右边了
- 对于||,左边是true 时就不做右边了
不要把复制组合进表达式
函数
函数头:返回类型 函数名(参数表)
{
函数体
}
调用函数
函数名(参数值);
没有参数也需要()
本地变量:定义在函数内部的变量
C语言不允许函数嵌套定义