声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。
作者:sumjess
适用:这本书我已经看过4遍了,但是该书的知识点我并不是都常用,所以总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做你的笔记。
目前内容:第五章总结
第五章:运算符、表达式和语句
1、基本运算符:
(1)赋值运算符:=
几个术语:数据对象、左值、右值和运算符:
赋值运算符目的是把值储存到内存位置上。用于存储的数据储存区统称为数据对象(data object)。 左值是C语言的术语,用于标识特定数据对象的名称或表达式。对象指的是实际的数据存储,而左值是 用于标识或定位储存位置的标签。右值指的是能赋值给可修改左值的量,且本身不是左值。在学习名称 时被称为“项”(如,赋值运算符左侧的项)的就是运算对象。
C语言可以连续赋值:a=b=c=5;
(2)加法运算符:+
加法运算符用于加法运算,使两侧的值相加。
相加的值(运算对象)可以是变量,也可以是常量。
(3)减法运算符:-
减法运算符用于减法运算,使两侧的值相减。
相减的值(运算对象)可以是变量,也可以是常量。
+和-运算符都可以被称为二元运算符,及这些运算符需要两个运算对象才能完成操作。(4)乘法运算符:*
乘法运算符用于乘法运算,使两侧的值相乘。
相乘的值(运算对象)可以是变量,也可以是常量。
(5)除法运算符:/
除法运算符用于除法运算,使两侧的值相除。
相除的值(运算对象)可以是变量,也可以是常量。
注意: 整数除法会截断计算结果的小数部分(丢弃整个小数部分),不会四舍五入结果;混合整数和浮 点数计算的结果是浮点数。(6)运算符优先级:
非常全的http://www.slyar.com/blog/c-operator-priority.html
2、其他运算符:
(1)sizeof运算符和size_t类型:
sizeof运算符以字节为单位返回运算对象的大小(在C中,1字节定义为char类型占用的空间大小。过去,1字节通常是8位)。运算对象可以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如,float),则必须用圆括号将其括起来。
//使用C99新增的%zd转换说明 --- 如果编译
//器不支持%zd,请将其改成%u或%lu
#include <stdio.h>
int main(void)
{
int n=0;
size_t insize;
intsize=sizeof(int);
printf("n=%d,n has %zd bytes;all ints have %zd bytes.\n",n,sizeof n,intsize);
return 0;
}
C语言规定,sizrof返回size_t类型的。这是一无符号整数类型,但他不是新类型。C语言系统中可以使用typedef把size_t作为unsigned int或unsigned long的别名。
(2)求模运算符:%
求模运算符用于整数计算。求模运算符给出其左侧整数除以右侧整数的余数。求模运算符只能用于整数,不能用于浮点数。
注意:如果第一个运算符是负数,那么求模的结果就是负数;如果第一个运算符是正数,那么求模的结果就是正数。
(3)递增运算符:++
递增运算符执行简单的任务,就是其运算对象递增加一。
有两种形式:++a和a++两种形式,区别在于递增行为发生的时间不同。
#include <stdio.h>
int main(void)
{
int a=1,b=1;
int a_post,pre_b;
a_post=a++;//后缀递增
pre_b=++b;//前缀递增
printf("a a_post b pre_b\n");
printf("%ld %5d %5d %5d",a,a_post,b,pre_b);
return 0;
}
即:n++是先使用n,再递增,而++n是先递增n,再使用。
(4)递减运算符:--
与 递增运算符:++ 类似不再介绍
注意:① 如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符;
② 如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符;
3、类型转换:
(1)基本的类型转换规则:
1、当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如果有必要会被转换成unsigned int(如果short和int的大小相同unsigned short就比int大。这种情况下,unsigned short将会被转换成unsigned int)。由于都是从较小类型转换成较大类型,所以这些转换被称为升级。
2、涉及两种类型运算,两个值会被分别转换成两种类型的更高级别。
3、类型的级别从高到低依次是long double、double、float、unsignedlong long、long long、unsigned long、long、unsigned int、int。(例外的情况:当long和int的大小相同时,unsigned int比long的级别更高。之所以short和char类型没有列出,是因为它们已经被升级到int或unsigned int)
4、在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能会导致类型升级或降级。所谓降级,是指把一种类型转换成更低的级别的类型。
5、当作为函数参数传递时,char和short被转换成int,float被转换为double。
(2)如果待转换的值与目标类型不匹配怎么办?这取决于转换涉及的类型。待赋值的值与目标类型不匹配时,规则如下。
1、目标类型是无符号整型,且待赋的值是整数时,额外的位将被忽略。
2、如果目标类型是一个有符号整数,且赋值的值是整数,结果因现实而异。
3、如果目标类型是个整数,且待赋的值是浮点数,该行为是未定义的。
(3)强制类型转换运算符:
1、用处、用法:
有时需要进行精确的类型转换,或者在程序中表明类型转换的意图。这种情况下要用到强制转换类型,即在某个量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型。
2、通用形式:
mice=(int)1.6+(float)10
3、注意:
一般而言,不应该混合使用类型(因此有些语言直接不允许这样做),但是偶尔这样做也是有用的。C语言的原则是避免给程序员设置障碍,但是程序员必须承担使用的风险和责任。
4、带参数的函数:
(1)声明参数就创建了被称为形式参数(简称形参)的变量;
(2)我们称函数调用传递的值为实际参数,简称实参;