首页 > 学院 > 开发设计 > 正文

《C和指针》第五章学习摘要

2019-11-14 13:13:45
字体:
来源:转载
供稿:网友

Chapter 5

操作符

算术操作符

“+ - * / %”%限定于整数类型,当/用于整型运算,意义为整除,但如果操作数存在负数,其结果由编译器定义。

移位操作符

左移位:<< 右移位:>>在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。在右移位中,从左边移入新位时,可以选择两种方案,一种是逻辑移位,左边移入的位用0填充;另一种是算术移位,左边移入的位由原先该值的符号位决定,符号位为1均为1,符号位为0均为0。移位操作符的操作数均为整型。对于无符号值执行逻辑移位,对于有符号值,是逻辑移位还是算术移位取决于编译器。

位操作符

与:& 或:| 异或:^

赋值

赋值操作符的结合性是从右到左,所以a=x=y+3等价于a=(x=y+3)等价于x=y+3;a=x;一个常见错误char ch;...while((ch = getchar() ) != EOF )EOF需要的位数比字符型值所能提供的位数要多,这也是getchar返回一个整型值而不是字符值的原因。然而,把getchar的返回值首先存储于ch中将导致它被截断,然后这个被截短的值被提升为整型并与EOF进行比较,当这段存在错误的代码在使用有符号字符集的机器上运行时,如果读取了一个值为/377的字节时,循环将会终止,因为这个值截短后再提升之后与EOF相等。

单目操作符

“! ++ - & sizeof ~ – + * (类型)”!执行逻辑反的操作,产生一个整型结果,0或1。~ 对整型类型的操作数进行求补操作,操作数中所有原先为1的位变为0,所有原先为0的位变成1。sizeof接数组名时返回数组长度,以字节为单位。判断表达式的结果字节长度并不需要对表达式进行赋值,所以sizeof(a=b+1)并没有改变a的值。++a = 10是错误的,因为++a结果相当于一个常量,不能作为左值。

逻辑操作符

C语言的逻辑操作符是“短路求值”,例如&&,当左边假则直接判定结果为假,不再计算右边。

逗号操作符

逗号操作符将两个或多个表达式分隔开来,这些表达式自左向右逐个进行求值,整个逗号表达式的值就是最后那个表达式的值。

左值和右值

左值就是能够出现在赋值号左边的东西,右值就是能够出现在赋值号右边的东西。字面值常量以及结果为常量的表达式不能够作为左值。

表达式求值

隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符型和短整形操作数在使用之前被转换为普通整型,这种转换为整型提升。

算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另外一个操作数的类型,否则操作就无法进行,下面的层次体系称为寻常算术转换: long double->double->float->unsigned long int->long int->unsigned int->int如果某个操作数的类型在上面这个列表中排名较低,那么首先它将转换成另外一个操作数的类型然后执行操作。一个表达式中可能存在多个算术转换的操作,注意对于每一个操作,都不能存在溢出。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表