

知识点提炼
字符类型
概念
char:character的简写,它是一种整数,也是特殊类型:字符型。
用单引号表示字符字面量;
printf scanf用%c
字符类型的输入输出
字符的输入:【scanf(“%c”,&c);】

//输入1;结果:c=49 c='1'
//scanf("%d",&c);如果c为char就不对,格式字符串"%d"需要int类型的参数
输入int 输出字符会怎么样?


//

ASCII码
//数字1和字符1是不一样的

如果非要输出d的值【printf("d=%d\n")】---------49(ASCII码值)
所以字符‘1’的ASCII编码是49,当整数为49时代表字符‘1’。
%d和%c的混合输入
有无空格有影响吗?

带空格

//
首先是第一个语句的试验,输入12 1
输出为

如果输入12a(中间没空格),或者12 1(中间很多空格)

都可以得到正确结果。
不带空格
如果用第二条输入语句:

则此处的32实际上为输入的空格。
字符计算
因为字符也属于一种整数,那么理应可以做些运算。
加法

则会输出B
减法

用Z减去A?会得到25。
也就是说字符加上一个数得到的结果还是字符。两个字符相减的结果是数字(这个数字代表了这两个字符的距离)。
因此有以下规律:

逃逸字符
概念:
是用来表示无法打印的控制字符和特殊字符,由一个反斜杠“\”开头,后面加上要打印的字符,两个字符合起来视作一个字符。

注意:
不同的终端在运行代码时候呈现的结果可能会不同。
\b 回退一格的意思并不是删除最后一位
\b的作用:相当于backspace,回退一个字符,如果紧跟输入新字符的话就会将最后的字符代替。如果没有的话就默认为无操作。(在devc终端下是这样)
\t的作用:相当于tab制表符,不代表相隔的数量,只有固定位置的区别

\n的作用:在一般的终端shell中会将\n回车翻译为同时执行回车和换行,但是实际上回车和换行是模拟打字机的两个独立的动作。
不同类型转换
自动类型转换:
当运算符两侧的类型不一致的时候,会自动转换成较大(能表达数的范围大)的类型。char<short<int<long<long long 。int<float<double。
但是在printf中,任何小于int的类型会被自动转换为int,float会被自动转换为double(%f)。会出现我们上文提到过的情况。
scanf是不会自动转换的,不过要输入short类型的数字需要%hd,longlong类型需要%ld。要给一个char类型输入整数,不行。只能先给一个整数类型输入整数,再把这个变量赋值给char类型变量。
强制类型转换
强制的类型转换(通常是大转小):(类型名)值
也就是值放外面。比如:
(int)10.2
(short)32768 //-32768
但是此时要注意数据安全性,因为小的量不一定总能表示大的量,最简单的,double转float,因为二者精度不同,转换之后就不一定相同了。
//再比如(short)32768。转换结果为: -32768
因为short类型能表示的最大整数就是32767,这个语句如果转换之后就会发生之前说过的“整数越界”。
如果是(char)32768。转换结果为:0
因为32768转为二进制就是:1后面跟15个0。依然是整数越界,(char取最后8个0)表示为0.
强制类型转换只是将变量计算为新类型的值,并不改变原有的变量类型和值。//因此转换后,输出原变量,仍然是原来的结果。
强制类型转换的优先级要比四则运算高

//因此这种情况会优先将a转换,但是不会将除号后的b也转换
修改:

逻辑类型bool
bool 类型:#include<stdbool.h> 包含该头文件之后可以使用bool、true、false

//可以给t赋值2——实际上并没有bool这种类型,实际上这些变量还是整数,定义、输出还是可以用整数。
//printf("%d\n",b);-----------1,printf不能输出true还是false,true为1。
逻辑运算:与或非
与或非的用法:
逻辑量是关系运算或逻辑运算的结果
逻辑运算是对逻辑量进行的运算,结果只有0或1。

4<x<6——【x>=4&&x<=6】
判断一个字符(定义为c)是否是大写字母——【c>='A'&&c<='Z'】
!age<20 ——【age大于等于20】
运算符的优先级:
!最高 &&其次 ||最低
加上之前我们学习过的,优先级顺序为:

也就是说!作为单目运算符优先级仅次于括号,而逻辑与和逻辑或的优先级只比赋值运算符高
短路
逻辑运算从左往右进行,如果左边运算结果已经足够决定最终结果,那么右边的计算会被跳过。
//比如说逻辑与两边需要全为真,结果才为真,因此如果左边为假,结果必然是0,右边的表达式就不会计算或者判断。而对于逻辑或两边只要有真就是真,如果左边为真,结果就是1。
&&左假则短路右边。||左真则短路右边。
此时,如果被短路的那边有赋值的话,就会被跳过,不会做计算。
如果有如下程序:

//则a++>1不会被执行,会输出OK和-1,也就是说a的值没有改变。所以最好不要把赋值/组合赋值运算放到逻辑运算里
条件运算? :
count=(count>20) ?count-10 :count+10;

右侧分别为条件,条件满足时候执行语句,条件不满足时候执行语句。(是不是? 是:不是)
条件运算是早期遗留下来的语句,如果进行嵌套的话会使可读性大大降低并增加复杂性。
不要使用嵌套的条件表达式
逗号运算 for循环

如果有语句
i=3+4,5+6;
//那么如果你进行编译,程序一定会报错,这句的执行过程是,计算3+4=7,由于逗号优先级甚至低于赋值运算符,所以会先把7赋值给i,然后再来计算5+6=11,但11没有任何变量来接收它,因此编译器会报warning。
//如果加上括号(提升了优先级),依旧会报warning,但是如果输出i的值,它的结果为11,因为逗号表达式的结果是右边的计算结果。
主要是用于for循环语句,我们应该还记得for语句中用分号分开了三部分,分别为初始赋值,退出条件,自增变量。在每个部分里如果想多写几个语句就需要用逗号隔开。
for(i=0,j=10;i<j;i++,j--)