一. 转义字符
1. 'n' //字符n
'\n' //一个字符 ---- 换行效果 --- 换行符
'\t' //制表符
'\b' //回退
'\r' //回车
其中\t(tab)包括之前一共8个字符站位,原字符长度由空格站位。
练习eg1:abc\tij#k\n 解:abc ij# (从a开始不包括i一共站位8个字符,最后\n换行(不明显))。
eg2:ab*c\t*de\rf\tg\n 解:fb*c gde (需要注意的事\r回车,它始终以光标为起点,当回车后,光标在a的位置上,所以f覆盖了a)。
2. 字符常量,可有几种表示
eg: 'A' '\101' '\x41'
编译后:65 0101 0x41
后2种不常用,直接明了表示即可。
二. 算术运算符(+ - * / % ++ -- ,)
1. 除法:1.如果是两个整型数 相除 效果相当于是整除
2.程序出错 编译时 出错 --- 语法问题
运行时 出错 --- 逻辑问题
3.除法运算 的 被除数不能为 0
2. 求余:1.求余运算的运算数 必须是 整型
2.被(除)操作数 不能为 0
3.求余运算的结果的符号 取决于 左操作数
其中有种情况
int a = -10;
unsigned int b = 5;
printf("a = %u\n",a);
if (a + b > 0)
{
printf("yes\n");
}
else
{
printf("no");
}
结果为yes 原因是int本质上 是signed int 但是他和unsigned一起运算时,要统一为unsigned 原因可看下表:
当多种数字类型在一起运算时,低优先服从高优先级并变成高优先级的数字类型,所以结果为正。
这里涉及隐式类型转化:1:从右向左;2.:从下到上,不同精度的类型混合运算时,低精度往高精度转,上图为运算规则.
eg:10 + 'a' + 1.5 - 8765.1234 * 'b' 结果为double类型。
---------------------------------------------------------------------------------------------------------------------------------
3. ++(自增)
a++ //后置++ ++a //前置++
先用后加 先加后用
注意:
1. 运算规则 ,单独使用时,没区别
参与到别的运算中时,此时运算规则发挥作用
2. 运算数必须是个左值
其中左值为能够放在左边的称为左值(可以被定位的:一般为变量)
右值为只能放到右边的称为右值 (不能被定位的:一般为常量,表达式)
练习eg:i+++i i初始值为1
里面设计贪心原则:从左到右,逐个扫描字符, 将字符尽可能多的结合成c语言的运算符
它可以拆分为 (i ++) +i,所以结果为(1+1)+1 = 3
eg2:i+++++i
先对他拆分 i++ ++ +i,这里出现了i++ 之后又在它的基础上++,这里涉及上面的注意2:运算数必须是个左值,i++不是左值,而是一个表达式,与原则矛盾,故编译错误。所以不要对同一个变量连续多次 ++ --。
4.--(自减)与++(自加)运算一致
5.注意优先级 谭浩强第三版p356 优先级有详尽表格。
6. 不同类型的数值混合赋值时,
eg1:高精度 =>低精度 double/float => int ---- 精度丢失
eg2. 长类型 => 短类型 --- 高位截断,其中小端(pc)记录是从低位向高位记录,所以会高位会无法记录,从而高位截断。
eg3:短类型 => 长类型 无符号 短类型 => 长类型 高位补0
有符号 短类型 => 长类型 高位补 符号位
7.逗号运算:整个逗号运算表达式中,最后一个表达式的结果(逗号优先级最低)
eg:
int i = 0;
int result;
result = (1+2,i++,3+4);
printf("result = %d\n",result);
printf("i = %d\n",i);
return 0;
结果:result = 3 i= 1,其中1+2 和3+4之间有逗号,优先级最低,所以result只需算到1+2即可,i++不受影响(优先级高)。
算术运算 > 赋值 > 逗号运算 。
三.
1152

被折叠的 条评论
为什么被折叠?



