DAY03学习
总算坚持了三天,但进度还是有点慢
字符和字符串
### 字符
在c语言中,我们使用char来声明字符变量,在printf函数中我们用%c来输出字符,但字符变量存放整数后会输出意想不到的结果
例:
#include <stdio.h>
int main()
{
char a='c';
printf("%c is %d\n",a,a);
return 0;
}
运行结果
c is 99
那 么可以猜测,字符是否和莫斯密码一样,有对应的数字让其可以在计算机中表示呢?
这一猜测的答案,就指向了ACSll字符表,该表用七位二进制数来表示所有的大写字母和小写字母,数字,标点符号,特殊控制字符
所以在一个变量里存放一些特定的数字,再声明它是字符变量,系统会通过这张表找到对应的字符
所以,字符型是特殊的整型
由此可知,可用signed和unsigned来修饰char,但有一点不一样,单独的char并没有默认signed,而是由系统自行决定,所以可能出现漏洞
字符串
字符串是由字符组成,所以只要在内存中分配一系列连续的存储空间即可表示
声明字符串语法:char 变量名[数量]
对字符串进行赋值,事实上就是对这块空间的每一个字符变量进行赋值,可以通过索引号,来获得每个字符变量的空间从而进行赋值
语法: 变量名[索引号] =字符
代码案例
char name[5];
name[0]='H';//给字符串赋值,索引号从0开始计算
name[1]='0';
name[2]='D';
name[3]='1';
name[4]='N';
或也可这样定义字符串
char name[5]={'H','0','D','1','N'};
但上述语句有一个弊端,即并没有给空值留下空位,即程序不知道这个字符串在哪里结束,所以会一直读取下去,再编辑一个printf函数就会出现报错现象
改正后:
char name[]={'H','0','D','1','N','\0'};
编译器其实可以自动帮你计算字符位数,所以[]内的数字可以省略
我们也可以直接写字符串常量
char name[]="H0D1N";
这样就不用写\0,双引号的存在会让编辑器自动帮你添加空值
算术运算符
运算符
c语言通过提供运算符让我们能对数据进行处理
算数运算符
+(双目)加法运算符 -(双目)减法运算符 *(双目)乘法预算符 /(双目)除法运算符
%(双目)求余运算符 +(单目) 正数运算符 -(单目)负数运算符
例
5/3=1 (若两个操作数都为整数,则结果采取舍弃小数的形式,非四舍五入)
5.0/3.0=1.66666667 (若两个操作数均为浮点数,则会得到一个相对逼近的结果
5%3=2(对于求余操作符,两个操作数都必须是整数,否则结果会报错“
目
我们把运算符作用的运算对象称为操作数,将一个运算符分为双目运算符或单目运算符,要看其作用几个操作数
1+2 将左右两边操作数相加,所以+为双目运算符 +3 只是表示一个数为正数,所以是单目运算符
表达式
用运算符和括号将操作数联系起来的式子,我们称之为表达式
1+2 ‘a’+‘b’ (字符) a+b (变量)这些都为表达式
运算符的优先级和结合性
优先级和结合性共同决定了一个表达式内算符的运算顺序
类型转换
请设想,一个运算符的操作数类型不同的时候会发生什么?
例如:
1 + 2.0,答案的数据类型是什么?整型还是浮点型?
当操作数类型不同时,编译器需要在运算前,要先将它们转换为某种数据类型,通常情况下,编译器会将占用内存较小的数据类型操作数先转换为另一个占用内存较大的数据的数据类型
所以 1+2.0==1.0+2.0 结果也是浮点数
目的:为了保证运算的精度
代码案例
#include <stdio.h>
int main()
{
printf("整型输出 %d\n",1+2.0);
printf("浮点型输出 %f\n",1+2.0);
return 0;
}
结果:
整型输出 0
浮点型输出 3.000000
上文已经说过,1+2.0的结果为浮点数,将浮点数强制为整型输出,则会出现打印错误,所以整型输出为0
但c语言允许强制转换操作数的输出类型,只需要在操作数前边,用小括号将目标数据类型给括起来即可
例
#include <stdio.h>
int main()
{
printf("整型输出 %d\n",1+(int)2.0);//将2.0转换为整型,即去掉小数部分
return 0;
}
输出结果:
整型输出 3