21年3月21日C语言概述(二)
1. 关于C语言中 \r 的使用
2.字符串的长度与大小
3.char类型的赋值
4.char的边界
5.字符串赋值里带上\ (转义字符的使用)
6.代码区,数据区,堆区,栈区 与 生存周期
7.C语言的取模
1. 关于C语言中 \r 的使用
出现 \r 后,后续的字符串从开头进行覆盖式的写入。注意,为什么有个空格?因为 \0也被写道前面了。
2.字符串的长度与大小
sizeof算出大小,字节单位。char类型的大小是1字节。
字符串stra虽然没有字符,但是字符以\0结束。\0不算入长度,但是算入大小。 所以stra大小一字节,长度0;
字符串straa输入的字符是空格,空格也算一个长度。 所以大小是2字节(空格+\0),长度是1。
字符串strb就正常的多。 长度9,大小10,易辨认。
字符串strbb,字符的输入中有\0,这算一个字节,所以大小是(hello+\0+word+\0)=11。注意他的长度,长度在输出的时候遇见\0就结束,所以长度是5(他的输出只有hello)
3.char类型的赋值
a赋值的时候赋的是字符0,字符0的ASCII值在十进制中是48,也就是说字符是以ASCII值的形式存储的。
b赋值的时候是\0,就是啥也没赋值,含义是空(null)。 b=''; 这个意思 (但是 b=''; 在编辑器不通过,报错。所以说意思是这个意思)
c赋值的是数字0,数字0在对应的ASCII中,字符是null。 空字符也有对应的ASCII值,就是0
d赋值就是把变量a的值在赋给它,这里赋的是变量a,不是字符a;
4.char的边界
char的范围是 -128~127 :因为char是一位,占8个比特 >> 0000 0000 (其中第一位表示正负,0为正 / 1为负),
8个比特能表示的数有255个,其中负数分去128个,非负数分去127个(含0)
0111 1111表示正数的最大值 >> 0111 1111的十进制是127 >> 范围是0000 0000 ~ 0111 1111 (0~127)
1000 0000表示负数的最小值 >> 1000 0000的十进制是128,但是第一个表示符号,所以是-128 >> 范围是1111 1111 ~ 1000 0001 (-127~-1) + 1000 0000(-128)
5.字符串赋值里带上\ (转义字符的使用)
字符串里有 \*** ,表示八进制,其中*表示3个数字。八进制的141换算成10进制是97,也就是a的ASCII值。
如果是abc\148de,输出就是abc+八进制对应的字符+8de。注意这里的8,之所以以字符的形式出现,是因为超出了8进制。
字符串里有 \x**,表示十六进制,其中*表示2个数字。规则同上,注意16进制越界的问题。(如下图)
6.代码区,数据区,堆区,栈区 与 生存周期
代码区,存放函数
数据区,存放全局变量。 当进程开始的时候,全局变量生;进程结束,全局变量死
堆,自己开辟,自己释放
栈 ,存放局部变量。 当函数被调用的时候,局部变量生;函数执行完后,局部变量死。
7.C语言的取模
对于整型数a,b来说,取模运算或者求余运算的方法都是:
1.求 整数商: c = [a/b];
2.计算模或者余数: r = a - c*b.
求模运算和求余运算在第一步不同: 取余运算在取商c的值时,向0 方向舍入(fix()函数);而取模运算在计算商c的值时,向负无穷方向舍入(floor()函数)。
例如计算:-7 Mod 4
那么:a = -7;b = 4;
第一步:求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入);
第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1 -7-(-8)=1,求余时r = -3 -7-(-4)=-3
归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。
当符号不一致时,结果不一样。
另外各个环境下 % 运算符的含义不同,比如c/c++,java 为取余,而python则为取模。
总结:就是商不同,取余的商偏向于0 >> c/c++,java 为取余
取模的商偏向于负无穷 >> python则为取模