C语言_0220笔记_字符计算/字符输入输出/ASCII码/逃逸/自动 强制类型转换/与或非/条件? :/逗号运算在for里

知识点提炼

字符类型

概念

  • char:character的简写,它是一种整数,也是特殊类型:字符型。

  • 用单引号表示字符字面量;

  • printf scanf用%c

字符类型的输入输出

  • 字符的输入:【scanf(“%c”,&c);】

//输入1;结果:c=49 c='1'

//scanf("%d",&c);如果c为char就不对,格式字符串"%d"需要int类型的参数

  1. 输入int 输出字符会怎么样?

//

ASCII码

  1. //数字1和字符1是不一样的

  • 如果非要输出d的值【printf("d=%d\n")】---------49(ASCII码值)

  • 所以字符‘1’的ASCII编码是49,当整数为49时代表字符‘1’。

%d和%c的混合输入

  • 有无空格有影响吗?

  1. 带空格

//

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

输出为

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

都可以得到正确结果。

  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的类型会被自动转换为intfloat会被自动转换为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--)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值